所以我正在研究LeetCode上的一个问题,在该问题上我必须反转一个二叉树。
问题:
这是我的解决方案:
class Solution {
public TreeNode invertTree(TreeNode root) {
TreeNode newTree = root;
return invertTreeHelper(root, newTree);
}
public TreeNode invertTreeHelper(TreeNode root, TreeNode newTree)
{
if(root == null)
return null;
newTree.val = root.val;
newTree.left = invertTreeHelper(root.right, newTree.left);
newTree.right = invertTreeHelper(root.left, newTree.right);
return newTree;
}
}
给定的输入为:
[4,2,7,1,3,6,9]
我的预期输出是:
[4,7,2,9,6,3,1]
但是,我的输出是:
[4,7,7,9,6,6,9]
很显然,我的输出不适用于树的左侧。我想知道我哪里做错了。有人可以帮助我吗?
答案 0 :(得分:3)
newTree = root
意味着如果现在更改newTree.left
也更改root.left
,则没有实际的新树,只需操作一棵树即可。如果要这样做,则必须注意不要覆盖以后需要的内容。如果要交换两个数字,则不能写a=b; b=a;
,因为在第二次分配时a
已经被更改。但是,您只能使用left
和right
来做到这一点。
基本上,您应该这样写:
public void invertTree(TreeNode node) {
if (node == null)
return;
TreeNode tmp = node.left;
node.left = node.right
node.right = tmp;
invertTree(node.left);
invertTree(node.right);
}
或者,您实际上可以创建一个新树,然后您不必担心tmp
部分,但是您需要在正确的位置放置很多new TreeNode
语句,因此您不必使用原始树和新树中的一个节点。