Java 很难理解为什么在尝试反转二叉树时必须创建新的临时树节点

Java 很难理解为什么在尝试反转二叉树时必须创建新的临时树节点,java,recursion,binary-tree,Java,Recursion,Binary Tree,我不明白为什么上面的解决方案有效,但下面的解决方案无效 public class Solution { public TreeNode invertTree(TreeNode root) { if(root == null) return null; TreeNode tmp = root.left; root.left = invertTree(root.right); root.right

我不明白为什么上面的解决方案有效,但下面的解决方案无效

public class Solution {
        public TreeNode invertTree(TreeNode root) {
        if(root == null) return null;
            TreeNode tmp = root.left;
            root.left = invertTree(root.right);
            root.right = invertTree(tmp);
            return root;
        }
}

请有人详细解释一下为什么必须有一个临时树节点才能使程序正常工作

第二次赋值后,您将root.right指定给root.left,但前一行将root.left设置为root.right,因此您的root.right等于自身。

第二次赋值后,您将root.right指定给root.left,但前一行将root.left设置为root.right,因此您的root.right等于自身。

第一次赋值后总之,第一个代码片段不会创建新的
TreeNode
。它只存储对根的原始左子级的引用

如果不保留该引用(如在第二个代码段中),则会丢失对根的原始左子树的引用,因为您将反转右子树的结果(在
root.left=invertTree(root.right);
)指定给root.left,因此
invertTree(root.left)
不在根目录的原始左子树上操作


从另一个角度来看,temp变量的原因与交换两个变量需要临时变量的原因类似。

首先,第一个代码段不会创建新的
树节点。它只存储对根的原始左子级的引用

如果不保留该引用(如在第二个代码段中),则会丢失对根的原始左子树的引用,因为您将反转右子树的结果(在
root.left=invertTree(root.right);
)指定给root.left,因此
invertTree(root.left)
不在根目录的原始左子树上操作

从另一个角度来看,temp变量的原因与交换两个变量时需要临时变量的原因类似

public class Solution {
        public TreeNode invertTree(TreeNode root) {
        if(root == null) return null;
            root.left = invertTree(root.right);
            root.right = invertTree(root.left);
            return root;
        }
}