java 反向A树LeetCode

izkcnapc  于 2023-02-21  发布在  Java
关注(0)|答案(2)|浏览(145)

所以我正在处理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]

很明显,我的输出对树的左边不起作用。我想知道我哪里出错了。有人能帮我吗?

64jmpszr

64jmpszr1#

newTree = root意味着如果你现在改变newTree.left,你也改变root.left,你没有实际的新树,你只需要在适当的地方操作一棵树。2如果你想这样做,你必须小心不要覆盖你以后需要的东西。如果你想交换两个数字,你不能写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语句,然后您一定不要在原始树和新树中同时使用节点。

wlwcrazw

wlwcrazw2#

这是我从leetcode得到的解决方案。这是一个简单的递归问题,有一个后序遍历。Soln是0(n),在leetcode上它在运行时排名前1%,在内存中排名前3

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 //recursion problem, swap every left with the right node in postorder 
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) return null;
        if(root.left == null && root.right == null) {
            return root;
        }
        invertTree(root.left);
        invertTree(root.right);
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        return root;
    }
}

相关问题