如何正确初始化依赖自身的泛型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
相关产品推荐
相关产品推荐

