【发布时间】:2020-06-06 05:10:16
【问题描述】:
这似乎是一个重复的问题,但我无法在 SOF 或其他地方的任何地方找到我的问题的答案。
我想在 JavaScript 具有 null 值表示 null 子树,而不是具有值 = null 的子树。
预期结果:
TreeNode {
val: 1,
left:
TreeNode {
val: 2,
left: TreeNode { val: 4, left: null, right: null },
right: null },
right:
TreeNode {
val: 3,
left: null,
right: TreeNode { val: 5, left: null, right: null } } }
上面的预期输出可以像这样手动完成:
const myTree = new TreeNode(1);
myTree.left = new TreeNode(2);
myTree.left.left = new TreeNode(4);
myTree.right = new TreeNode(3);
myTree.right.right = new TreeNode(5);
树应该是这样的:
1
/\
2 3
/ \
4 5
这是我的代码:
class TreeNode {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
insert(values, i = 0) {
if (i >= values.length) return;
const queue = [this];
while (queue.length > 0) {
let current = queue.shift();
if (current.left === null) {
current.left = new TreeNode(values[i]);
break;
}
queue.push(current.left);
if (current.right === null) {
current.right = new TreeNode(values[i]);
break;
}
queue.push(current.right);
}
this.insert(values, i + 1);
return this;
}
}
(function() {
// This builds a tree with null nodes with null values and null children.
// The goal is to skip updating any null child
const myTree = new TreeNode(1);
myTree.insert2([2,3,4,null,null,5]);
console.log(myTree);
}());
这里的问题是我得到一个 null 子作为 TreeNode ,其 value = null 像这样:
TreeNode {
value: 1,
left:
TreeNode {
value: 2,
left: TreeNode { value: 4, left: null, right: null },
right: TreeNode { value: null, left: null, right: null } },
right:
TreeNode {
value: 3,
left: TreeNode { value: null, left: null, right: null },
right: TreeNode { value: 5, left: null, right: null } } }
我可以通过添加来处理空节点的子节点:
constructor(value) {
this.value = value;
if (value) this.left = null;
if (value) this.right = null;
}
但我无法仅添加 null 值而不是完整的 TreeNode。
我试过了:
if (current.left === null) {
current.left = values[i] !== null ? new BinaryTree(values[i]) : null;
break;
}
或者:
if (current.left === null && values[i]) {}
或者:
if (!values[i]) return;
但是没有返回预期的结果。
我还查看了一些使用 Java 的解决方案,但答案使用 Java 中的内置 LinkedList,所以我不确定在 JS 中这样做是否正确。
的预期结果回答 Scott Sauyet 的问题:
const myTree = new TreeNode (1);
myTree .insert ([2,null, 4, null, 6, 7])
是:
TreeNode {
val: 1,
left: TreeNode {
val: 2,
left: TreeNode {
val: 4,
left: TreeNode { val: 6, left: null, right: null },
right: TreeNode { val: 7, left: null, right: null }
},
right: null
},
right: null
}
【问题讨论】:
-
你能澄清一下吗?您的意思是:输出是否可以包含 0 作为空节点,或者您是否希望我在代码中添加 0 而不是空值?
-
不,抱歉。但是如果你没有起始节点应该怎么办?
-
const myTree = new TreeNode (1); myTree .insert ([2,null, 4, null, 6, 7])的预期行为是什么?也就是说,如果你不创建应该是其他节点(6和7)的父节点的节点(3)会发生什么? -
@ScottSauyet:我已经用你的问题的答案更新了我的问题。
-
@HereticMonkey 我同意。但是,在我必须实现另一个 LinkedList 类来构建 BinaryTree 之前,我想先尝试不使用。