当前位置:首页 > JavaScript

js实现树

2026-02-01 05:58:07JavaScript

实现树结构的基本方法

在JavaScript中实现树结构通常涉及创建节点(Node)和树(Tree)类,节点包含数据和子节点的引用,树类提供操作方法如插入、删除、遍历等。

定义节点类 每个节点包含数据(value)和子节点(children):

class TreeNode {
  constructor(value) {
    this.value = value;
    this.children = [];
  }
}

定义树类 树类包含根节点和操作方法:

js实现树

class Tree {
  constructor() {
    this.root = null;
  }

  // 插入节点(需指定父节点)
  insert(value, parentValue) {
    const newNode = new TreeNode(value);
    if (!this.root) {
      this.root = newNode;
      return;
    }
    this._insertNode(this.root, newNode, parentValue);
  }

  _insertNode(currentNode, newNode, parentValue) {
    if (currentNode.value === parentValue) {
      currentNode.children.push(newNode);
      return;
    }
    for (const child of currentNode.children) {
      this._insertNode(child, newNode, parentValue);
    }
  }
}

树的遍历方法

深度优先遍历(DFS) 递归实现先序遍历:

class Tree {
  // ...其他代码
  traverseDFS(callback) {
    this._traverseDFSNode(this.root, callback);
  }

  _traverseDFSNode(node, callback) {
    callback(node.value);
    for (const child of node.children) {
      this._traverseDFSNode(child, callback);
    }
  }
}

广度优先遍历(BFS) 使用队列实现层级遍历:

js实现树

class Tree {
  // ...其他代码
  traverseBFS(callback) {
    const queue = [this.root];
    while (queue.length > 0) {
      const currentNode = queue.shift();
      callback(currentNode.value);
      queue.push(...currentNode.children);
    }
  }
}

实际应用示例

创建树并操作

const tree = new Tree();
tree.insert(1);          // 根节点
tree.insert(2, 1);       // 子节点
tree.insert(3, 1);       // 子节点
tree.insert(4, 2);       // 孙子节点

// 遍历示例
tree.traverseDFS(console.log); // 输出: 1, 2, 4, 3
tree.traverseBFS(console.log); // 输出: 1, 2, 3, 4

特殊树结构的实现

二叉树实现 限制每个节点最多有两个子节点:

class BinaryTreeNode {
  constructor(value) {
    this.value = value;
    this.left = null;
    this.right = null;
  }
}

二叉搜索树(BST)插入

class BinarySearchTree {
  constructor() {
    this.root = null;
  }

  insert(value) {
    const newNode = new BinaryTreeNode(value);
    if (!this.root) {
      this.root = newNode;
      return;
    }
    let current = this.root;
    while (true) {
      if (value < current.value) {
        if (!current.left) {
          current.left = newNode;
          break;
        }
        current = current.left;
      } else {
        if (!current.right) {
          current.right = newNode;
          break;
        }
        current = current.right;
      }
    }
  }
}

性能优化建议

  • 对于大规模数据,使用循环代替递归防止栈溢出
  • 需要快速查找时,考虑平衡二叉搜索树(如AVL树)
  • 频繁插入/删除场景可使用B树或红黑树变体

标签: js
分享给朋友:

相关文章

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <htm…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…