力扣226 翻转二叉树

翻转二叉树

1. 误解

/**
 * 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;
 *     }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null) return root;
        dfs(root.left, root.right);
        return root;
    }

    public void dfs(TreeNode left, TreeNode right) {
        if(left == null && right == null) return;

        TreeNode tmp = left;
        left = right;
        right = tmp;
        if(left != null)
            dfs(left.left, left.right);
        if(right != null)    
            dfs(right.left, right.right);
    }

}

递归传参左右子节点,并交换两个节点。
但是这样并不会实际地交换左右两个节点,解释为Java中传参都为值传递,理解为入参对象指向了实参的堆中的地址,因此交换两个节点时,对实参没有影响(new一个新对象赋给入参同样没有)。
引用传递理解为入参对象指向实参,对入参对象的地址更改将影响到实参。

2. 修改

/**
 * 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;
 *     }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        dfs(root);
        return root;
    }

    public void dfs(TreeNode root) {
        if(root == null) return;

        if(root.left == null && root.right == null) return;

        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
        
        dfs(root.left);   
        dfs(root.right);
    }

}
posted @ 2022-12-21 18:03  OraCat  阅读(4)  评论(0编辑  收藏  举报