每日一题:反转二叉树

272 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

image.png

输入: root = [4,2,7,1,3,6,9]
输出: [4,7,2,9,6,3,1]

示例 2:

image.png

输入: root = [2,1,3]
输出: [2,3,1]

示例 3:

输入: root = []
输出: []

解题思路

1. 递归

我们只需要在遍历二叉树的过程中,将每个节点下的左右孩子交换一下,就可以实现反转二叉树

需要注意的是,这道题可以使用前序遍历和后序遍历,唯独不能使用中序遍历

因为中序遍历【左中右】会先将左节点的左右孩子交换后

再交换中间节点的左右孩子

最后交换右节点的左右孩子

但最后一步的右节点其实是初始二叉树的左节点翻转过去的,而左节点的左右孩子已经在第一步翻转过了,所以左节点的孩子其实是反转了两次,而右节点的孩子并没有进行翻转

递归解法代码如下:

public TreeNode invertTree(TreeNode root) {
        TreeNode node = inver(root);
        return node;
    }

    public TreeNode inver(TreeNode root) {
        if (root == null) {
            return null;
        }

        //这里用的是前序遍历,即先进行交换,再遍历
        swap(root);
        inver(root.left);
        inver(root.right);

        return root;
    }

    public void swap(TreeNode root) {
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
    }

2. 层序遍历

这道题也可以诶用层序遍历来解决,因为层序遍历也可以把每个节点的左右孩子都翻转一遍,代码如下:

public TreeNode invertTree(TreeNode root) {
        Queue<TreeNode> quque = new LinkedList<>();
        if (root != null) {
            quque.offer(root);
        }
 
        while (!quque.isEmpty()) {
            int size = quque.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = quque.poll();

                swap(node);
                if (node.left != null) {
                    quque.offer(node.left);
                }

                if (node.right != null) {
                    quque.offer(node.right);
                }
            }
        }

        return root;
    }

    public void swap(TreeNode node) {
        TreeNode temp = node.left;
        node.left = node.right;
        node.right = temp;
    }

总结

对于二叉树的题,一定要清楚使用的是前中后序遍历,还是层序遍历,才能轻松的解决问题