Java 为什么这不会反转二叉树?

Java 为什么这不会反转二叉树?,java,algorithm,tree,binary-tree,Java,Algorithm,Tree,Binary Tree,我不知道为什么这段反转二叉树的代码不起作用。当我反转值而不是实际节点时,它工作,但在这种情况下,如果节点为空,则不工作,这就是我需要使用节点进行反转的原因 您可以取消对打印行的注释,以查看它是否达到了正确的值,并按照应该更改的方式更改了树,但它返回了原始数组 class Solution { public TreeNode invertTree(TreeNode root) { if(root == null) {

我不知道为什么这段反转二叉树的代码不起作用。当我反转值而不是实际节点时,它工作,但在这种情况下,如果节点为空,则不工作,这就是我需要使用节点进行反转的原因

您可以取消对打印行的注释,以查看它是否达到了正确的值,并按照应该更改的方式更改了树,但它返回了原始数组

    class Solution {
        public TreeNode invertTree(TreeNode root) {
            if(root == null) {
                return null;
            }
            invertBinaryTree(root.left, root.right);
            return root;
        }
        
    private static void invertBinaryTree(TreeNode l, TreeNode r) {
    if(l == null || r == null) {
        return;
    }
    
    TreeNode temp = l;
    l = r;
    r = temp;
        
//     System.out.println(l.val);
//     System.out.println(r.val);
        
    
    invertBinaryTree(l.left, r.right);
    invertBinaryTree(l.right, r.left);
        

}
}
Java对方法参数使用“按值传递”,而不是“按引用传递”。这意味着,如果将对象传递给方法,则可以更新方法中对象的成员变量,更改将反映在调用方法中,但是如果覆盖参数以引用不同的对象(就像更改l和r的值一样)调用方法中将不会更新对该对象的引用。您可以将函数重写为以下内容:

private static void invertBinaryTree(TreeNode t) {
     TreeNode temp = t.left;
     t.left = t.right;
     t.right = temp;

     if(t.left != null)
         invertBinaryTree(t.left);
     if(t.right != null)
         invertBinaryTree(t.right);
}

然后通过传递
invertBinaryTree(root)在树的顶部调用它

将值反转将起作用。此外,如果其中一个为空,则返回。条件应该是if(l==null&&r==null),因为您只更改局部变量。要反转树,必须执行类似于
TreeNode temp=node.left的操作;node.left=node.right;node.right=temp@PavelSmirnov,但我从原始树的根向右和向左传递。它不是通过引用传递的吗?@sathvikp反转这些值是不起作用的,其中一方可能是空的,在这种情况下,它仍然是一个二叉树,但您无法查找它的值