写一个方法获取树形结构的所有父节点和子节点

在前端开发中,处理树形结构的数据是一个常见的任务。下面是一个简单的JavaScript方法,用于获取树形结构中指定节点的所有父节点和子节点。

首先,我们定义一个基本的树节点对象:

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

接下来,我们编写两个方法:getAllParentsgetAllChildrengetAllParents 方法用于获取指定节点的所有父节点,而 getAllChildren 方法用于获取指定节点的所有子节点。

由于树形结构通常是从根节点开始的,因此我们需要从根节点开始遍历以找到目标节点,并在此过程中收集父节点。同样地,为了获取所有子节点,我们需要递归地遍历目标节点的子树。

function getAllParents(root, target, parents = []) {
  if (!root) return null;
  
  // 如果当前节点是目标节点,返回父节点数组
  if (root === target) {
    return parents;
  }
  
  // 遍历子节点
  for (let child of root.children) {
    let found = getAllParents(child, target, [...parents, root]);
    if (found) {
      return found;
    }
  }
  
  // 没有找到目标节点,返回null
  return null;
}

function getAllChildren(node, children = []) {
  if (!node) return children;
  
  // 添加当前节点的子节点到数组中
  children.push(...node.children);
  
  // 递归遍历子节点
  for (let child of node.children) {
    getAllChildren(child, children);
  }
  
  return children;
}

使用示例:

// 创建一个简单的树形结构
let root = new TreeNode('A', [
  new TreeNode('B', [
    new TreeNode('D'),
    new TreeNode('E')
  ]),
  new TreeNode('C', [
    new TreeNode('F'),
    new TreeNode('G')
  ])
]);

let targetNode = root.children[1].children[0]; // 目标节点是 'F'

// 获取目标节点的所有父节点
let parents = getAllParents(root, targetNode);
parents.forEach(parent => console.log(parent.value)); // 输出: A C

// 获取目标节点的所有子节点(在这个例子中,'F' 没有子节点,所以输出为空)
let children = getAllChildren(targetNode);
children.forEach(child => console.log(child.value)); // 无输出,因为 'F' 没有子节点

注意:在实际应用中,你可能需要根据具体的树形结构数据格式和需求来调整这些方法。例如,如果你的树形结构是以嵌套对象或数组的形式表示的,那么你可能需要稍微修改这些方法来适应你的数据结构。

posted @ 2025-01-05 09:30  王铁柱6  阅读(65)  评论(0编辑  收藏  举报