当前位置:首页 > JavaScript

js 实现树形结构

2026-04-04 03:02:29JavaScript

树形结构的实现方法

在JavaScript中实现树形结构可以通过多种方式完成,以下是几种常见的方法:

使用对象表示树

可以通过嵌套对象来表示树形结构,每个节点包含一个值和一个子节点数组。

const tree = {
  value: 'root',
  children: [
    {
      value: 'child1',
      children: []
    },
    {
      value: 'child2',
      children: [
        {
          value: 'grandchild1',
          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('child1');
const child2 = new TreeNode('child2');
root.addChild(child1);
root.addChild(child2);

使用数组表示扁平化树

扁平化的数组结构可以通过idparentId来表示树形关系。

js 实现树形结构

const flatTree = [
  { id: 1, parentId: null, name: 'root' },
  { id: 2, parentId: 1, name: 'child1' },
  { id: 3, parentId: 1, name: 'child2' },
  { id: 4, parentId: 2, name: 'grandchild1' }
];

树形结构的遍历方法

深度优先遍历(DFS)

递归实现深度优先遍历:

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

广度优先遍历(BFS)

使用队列实现广度优先遍历:

function bfs(root) {
  const queue = [root];
  while (queue.length > 0) {
    const node = queue.shift();
    console.log(node.value);
    node.children.forEach(child => queue.push(child));
  }
}
bfs(tree);

扁平化数组转树形结构

将扁平化数组转换为嵌套的树形结构:

js 实现树形结构

function buildTree(items) {
  const map = {};
  const roots = [];

  items.forEach(item => {
    map[item.id] = { ...item, children: [] };
  });

  items.forEach(item => {
    if (item.parentId === null) {
      roots.push(map[item.id]);
    } else {
      map[item.parentId].children.push(map[item.id]);
    }
  });

  return roots;
}

const nestedTree = buildTree(flatTree);
console.log(nestedTree);

树形结构的常见操作

查找节点

通过递归查找特定节点:

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

const foundNode = findNode(tree, 'child2');
console.log(foundNode);

删除节点

通过递归删除特定节点:

function removeNode(node, value) {
  node.children = node.children.filter(child => child.value !== value);
  node.children.forEach(child => removeNode(child, value));
}

removeNode(tree, 'grandchild1');
console.log(tree);

树形结构的渲染

在前端页面中渲染树形结构,通常使用递归组件或动态生成DOM元素:

function renderTree(node, parentElement) {
  const element = document.createElement('div');
  element.textContent = node.value;
  parentElement.appendChild(element);

  if (node.children.length > 0) {
    const childrenContainer = document.createElement('div');
    childrenContainer.style.marginLeft = '20px';
    parentElement.appendChild(childrenContainer);
    node.children.forEach(child => renderTree(child, childrenContainer));
  }
}

const container = document.getElementById('tree-container');
renderTree(tree, container);

以上方法涵盖了树形结构的基本实现、遍历、转换和操作,可以根据具体需求选择适合的方式。

标签: 结构js
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js进度条实现

js进度条实现

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

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…

js实现按钮点击

js实现按钮点击

实现按钮点击的JavaScript方法 HTML按钮元素 在HTML中创建按钮元素,为其添加id或class以便JavaScript选择: <button id="myButton">点…