LeetCode二叉树专题 (10) 翻转二叉树

212 阅读3分钟

题目

题目地址

解题思路

这道题比较简单,大家可以自己先想想
。。。
。。。 🐟 。。。
🐟 。。。

反转二叉树的目的就是交换每个结点的左右结点

递归解题

子问题就出来,交换两个结点即可。对每一个递归到的元素都执行这个操作。返回值和终止条件就是遍历完所有元素返回根结点。

迭代解题

如果使用层序遍历,也只要在遍历下面的一层时,交换左右子树即可。
比如,上面的树为例,第一层是4,第二层是7,2。遍历4时,我们交换7和2,然后放入队列中,遍历7和2时,同样如此。

递归代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null){
            //终止条件为空时
            return null;
        }
        //子问题:交换左右子树
        TreeNode left = root.left;
        root.left = root.right;
        root.right = left;
        
        //递归上面的子问题
        invertTree(root.left);
        invertTree(root.right);
        
        //返回结果
        return root;
    }
}

迭代代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        //使用队列
        LinkedList<TreeNode> list = new LinkedList<>();
        list.add(root);
        while(!list.isEmpty()){
            TreeNode tree = list.poll();
            if(tree != null){
            
                //交换左右两个结点
                TreeNode left =  tree.left;
                tree.left = tree.right;
                tree.right = left;
                
                //BFS
                if(tree.left != null){
                    list.add(tree.left);
                }
                if(tree.right != null){
                    list.add(tree.right);
                }
            }
        }
        return root;
    }
}
- END -