所以我正在处理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]
很明显,我的输出对树的左边不起作用。我想知道我哪里出错了。有人能帮我吗?
2条答案
按热度按时间64jmpszr1#
newTree = root
意味着如果你现在改变newTree.left
,你也改变root.left
,你没有实际的新树,你只需要在适当的地方操作一棵树。2如果你想这样做,你必须小心不要覆盖你以后需要的东西。如果你想交换两个数字,你不能写a=b; b=a;
,因为在第二次赋值时a
已经被改变了。但是,您可以使用left
和right
执行此操作。基本上你应该写:
或者,您可以实际创建一个新树,这样您就不必担心
tmp
部分,但您需要在正确的位置使用相当多的new TreeNode
语句,然后您一定不要在原始树和新树中同时使用节点。wlwcrazw2#
这是我从leetcode得到的解决方案。这是一个简单的递归问题,有一个后序遍历。Soln是0(n),在leetcode上它在运行时排名前1%,在内存中排名前3