【发布时间】:2020-05-26 08:11:01
【问题描述】:
这是 JavaScript 中二叉树节点的定义。
function TreeNode(val, left, right) {
this.val = (val===undefined ? 0 : val)
this.left = (left===undefined ? null : left)
this.right = (right===undefined ? null : right)
}
我目前正在尝试反转二叉树。这是完整的代码。
var invertTree = function(root) {
if(root === null) return null
else return invertTreeHelper(root, root.left, root.right)
};
var invertTreeHelper = function(node, left, right) {
if(left === null && right === null) { return node }
else if(left === null && right !== null) {
left = right
right = null
invertTreeHelper(node, left.left, left.right)
return node
} else if(left !== null && right === null) {
console.log(right)
right = left
console.log(right)
console.log(node)
left = null
invertTreeHelper(node, right.left, right.right)
return node
} else {
console.log("swapping " + left.val + " and " + right.val)
let temp = left.val
left.val = right.val
right.val = temp
invertTreeHelper(node, left.left, right.right)
invertTreeHelper(node, left.right, right.left)
return node
}
};
但是,这是我遇到问题的部分。其他一切正常。
else if(left !== null && right === null) {
console.log(right)
right = left
console.log(right)
console.log(node)
left = null
invertTreeHelper(node, right.left, right.right)
return node
}
所以在上面显示的部分中,我尝试将空节点与非空(现有节点)交换,但它似乎并没有修改原始树,因为当我在交换节点后打印节点时,我可以看到它正确交换但原始树没有被修改(它在原始树中保持为空)。我试过node.left 而不是仅仅调用left ,当我这样做时,它似乎像我想要的那样修改了原始树,但我很困惑,因为在代码的另一部分如下所示,我能够通过调用left.val 而不是node.left.val 正确交换值,当我打印树时,我看到原始树中的值实际上已被修改。所以也许我要问的是为什么用left.val 交换值而不调用node.left.val 似乎会修改原始树,但为什么只用left 交换节点而不调用node.left 不会。这是我交换值并修改原始树的部分。
else {
console.log("swapping " + left.val + " and " + right.val)
let temp = left.val
left.val = right.val
right.val = temp
invertTreeHelper(node, left.left, right.right)
invertTreeHelper(node, left.right, right.left)
return node
}
我是树新手,所以请告诉我我缺少什么。谢谢。
【问题讨论】: