226. 翻转二叉树
- 代码1 报错
- 代码2 报错
- 代码3 正确。
代码1 报错
class Solution {
    public TreeNode invertTree(TreeNode root) {
        // TreeNode _root = root; // 这是在保证
        // _root = preOrderTree(root);
        // return root;
        root = preOrderTree(root);
        return root;
    }
    public TreeNode preOrderTree(TreeNode root) {
        if(root == null) return root;
        swapNode(root.left, root.right);
        preOrderTree(root.left);
        preOrderTree(root.right);
        return root;
    }
    public void swapNode(TreeNode left, TreeNode right) {
        TreeNode tmp = left;
        left = right;
        right = tmp;
    }
}
是错的
 
代码2 报错
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null) return root;
        swapNode(root.left, root.right);
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
    public void swapNode(TreeNode left, TreeNode right) {
        TreeNode tmp = left;
        left = right;
        right = tmp;
    }
}
还是错的
 
代码3 正确。
代码3和代码1、2的区别在swap函数上。
 想不通
 在各大平台问了一下,终于明白了。
  分析: 在 Java 中,参数是按值传递的,而不是按引用传递的。我的swapNode函数,只交换了临时变量的值(引用),返回后,原本的树中结点值不变。
 在这个修改后的版本中,swapNode 函数只接受一个参数 root,并直接在这个节点上交换左右子树的值。这样就能正确地实现二叉树翻转的功能。
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null) return root;
        swapNode(root);
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
    public void swapNode(TreeNode root) {
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
    }
}
这样是对的
 














![[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07-4 轨迹追踪](https://img-blog.csdnimg.cn/direct/40f20d6d28c74c3a981944c5315bfd56.png#pic_center)




