逆树LeetCode

时间:2020-09-24 08:11:03

标签: java binary-tree

所以我正在研究LeetCode上的一个问题,在该问题上我必须反转一个二叉树。

问题:

image of the problem

这是我的解决方案:

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]

很显然,我的输出不适用于树的左侧。我想知道我哪里做错了。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

newTree = root意味着如果现在更改newTree.left也更改root.left,则没有实际的新树,只需操作一棵树即可。如果要这样做,则必须注意不要覆盖以后需要的内容。如果要交换两个数字,则不能写a=b; b=a;,因为在第二次分配时a已经被更改。但是,您只能使用leftright来做到这一点。
基本上,您应该这样写:

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语句,因此您不必使用原始树和新树中的一个节点。