当前位置:首页 > JavaScript

js实现树状

2026-04-06 11:36:49JavaScript

js实现树状结构

树状结构在JavaScript中通常用于表示层级数据,例如文件系统、组织架构或菜单。以下是几种常见的实现方式:

使用对象表示树

最简单的树状结构可以通过嵌套对象实现:

const tree = {
  value: 'Root',
  children: [
    {
      value: 'Child 1',
      children: [
        { value: 'Grandchild 1', children: [] },
        { value: 'Grandchild 2', children: [] }
      ]
    },
    {
      value: 'Child 2',
      children: []
    }
  ]
};

使用类实现树节点

更结构化的方式是通过类定义树节点:

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

  addChild(childNode) {
    this.children.push(childNode);
  }
}

const root = new TreeNode('Root');
const child1 = new TreeNode('Child 1');
const child2 = new TreeNode('Child 2');
root.addChild(child1);
root.addChild(child2);

递归遍历树

深度优先遍历的递归实现:

js实现树状

function traverse(node) {
  console.log(node.value);
  node.children.forEach(child => traverse(child));
}

非递归遍历

使用栈实现深度优先遍历:

function traverse(root) {
  const stack = [root];
  while (stack.length) {
    const node = stack.pop();
    console.log(node.value);
    for (let i = node.children.length - 1; i >= 0; i--) {
      stack.push(node.children[i]);
    }
  }
}

树状结构可视化

使用递归生成HTML结构的示例:

js实现树状

function renderTree(node) {
  if (!node.children.length) return `<li>${node.value}</li>`;
  return `
    <li>
      ${node.value}
      <ul>
        ${node.children.map(child => renderTree(child)).join('')}
      </ul>
    </li>
  `;
}

查找节点

深度优先搜索实现:

function findNode(root, targetValue) {
  if (root.value === targetValue) return root;
  for (const child of root.children) {
    const found = findNode(child, targetValue);
    if (found) return found;
  }
  return null;
}

性能优化

对于大型树结构,可以考虑以下优化:

  • 使用备忘录模式缓存遍历结果
  • 实现广度优先搜索时使用队列
  • 为节点添加唯一标识符便于查找

实际应用示例

文件目录树的实现:

class FileSystem {
  constructor(name, isFolder = false) {
    this.name = name;
    this.isFolder = isFolder;
    this.children = [];
  }

  addItem(item) {
    if (!this.isFolder) throw new Error('Can only add to folders');
    this.children.push(item);
  }

  find(path) {
    const parts = path.split('/');
    let current = this;
    for (const part of parts) {
      if (!part) continue;
      const found = current.children.find(item => item.name === part);
      if (!found) return null;
      current = found;
    }
    return current;
  }
}

标签: 树状js
分享给朋友:

相关文章

vue实现多个树状图

vue实现多个树状图

Vue实现多个树状图的方法 在Vue中实现多个树状图可以通过组件化方式完成,通常使用递归组件或第三方库(如Element UI的Tree组件)。以下是具体实现方法: 使用递归组件实现基础树状结构 递…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…

js实现删除

js实现删除

使用 splice 方法删除数组元素 splice 方法可以删除数组中的元素,并返回被删除的元素。它接受两个参数:起始索引和要删除的元素数量。 const array = [1, 2, 3, 4…