You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确初始化依赖自身的泛型TreeNode类?

如何正确初始化依赖自身的TreeNode类

先把你给出的类定义贴出来,方便对照:

export class TreeNode<T> {
  constructor(public value: T, public children: TreeNode<T>[]) {}
  toString(): string {
    return `TreeNode(${this.value})`;
  }
}

其实这个类的初始化逻辑核心就是先构建子节点,再传给父节点,根据场景不同有几种写法:

1. 创建叶子节点(无后代)

如果是树最末端的节点,直接传空数组作为children参数就行:

// 创建一个值为"leaf-node"的叶子节点
const leaf = new TreeNode<string>("leaf-node", []);
console.log(leaf.toString()); // 输出 TreeNode(leaf-node)

2. 创建带子节点的父节点

这种情况要先把所有子节点创建好,再把它们放进数组传给父节点的构造函数:

// 先造两个子节点
const childA = new TreeNode<number>(10, []);
const childB = new TreeNode<number>(20, []);

// 再用这两个子节点构建父节点
const parent = new TreeNode<number>(5, [childA, childB]);
console.log(parent.toString()); // 输出 TreeNode(5)

3. 递归生成复杂树形结构

如果树的层级比较深,手动一个个创建太麻烦,用递归函数批量生成是最优解,比如构建一个二叉数字树:

function buildBinaryTree(depth: number, currentVal: number): TreeNode<number> {
  // 深度为0时,返回叶子节点
  if (depth === 0) {
    return new TreeNode(currentVal, []);
  }
  // 递归生成左右子节点
  const kids = [
    buildBinaryTree(depth - 1, currentVal * 2),
    buildBinaryTree(depth - 1, currentVal * 2 + 1)
  ];
  return new TreeNode(currentVal, kids);
}

// 生成一个深度为2、根节点值为1的树
const complexTree = buildBinaryTree(2, 1);
console.log(complexTree.toString()); // 输出 TreeNode(1)

小优化:给children加默认值

要是觉得每次创建叶子节点都要写[]太繁琐,可以修改类的构造函数,给children参数加个默认空数组:

export class TreeNode<T> {
  // 这里加个默认值,省得每次传空数组
  constructor(public value: T, public children: TreeNode<T>[] = []) {}
  toString(): string {
    return `TreeNode(${this.value})`;
  }
}

// 现在创建叶子节点就简洁多了
const simpleLeaf = new TreeNode<string>("super-simple-leaf");

这样不管是简单的叶子节点还是复杂的多层树,都能轻松初始化啦~

内容的提问来源于stack exchange,提问作者Tek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:38:16