剑指 Offer 27. 二叉树的镜像

89 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 14 天,点击查看活动详情

本文已同步至:村雨遥

题目

剑指 Offer 27. 二叉树的镜像

描述

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如输入:

     4
   /   \
  2     7
 / \   / \
1   3 6   9

镜像输出:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

  示例 1:

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

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

限制:

0 <= 节点个数 <= 1000

实现方法

方法 1:递归

思路

这是一道关于二叉树的题目,从根节点开始,递归地对数进行遍历,同时将叶子节点翻转从而得到原先的镜像。若当前遍历节点 root 的左右子树都已经完成反转并得到了镜像,那么此时将左右子树的位置进行交换,就可以得到以 root 作为根节点的整个二叉树镜像了。就有点类似于平常我们交换两个数的值一样,定义一个中间值,然后将左右两个值通过这个中间值进行交换。

int tmp = num1;
num1 = num2;
num2 = tmp;

迁移到左右子节点交换就可以得到:

TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;

实现

class Solution {
    public TreeNode mirrorTree(TreeNode root) {
        if (root != null) {
            TreeNode temp = root.left;
            root.left = mirrorTree(root.right);
            root.right = mirrorTree(temp);
        }
        return root;
    }
}

结果

方法 2:辅助栈

思路

虽然利用递归的方式可以很方便的实现二叉树的镜像,但除此之外我们还可以使用栈来辅助我们实现镜像二叉树。通过栈来遍历整个二叉树的所有节点,然后交换每个节点的左右子节点即可。

实现

class Solution {
    public TreeNode mirrorTree(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>() {{ add(root); }};
        if(root != null){
            while(!stack.isEmpty()) {
                TreeNode node = stack.pop();
                if(node.left != null) stack.add(node.left);
                if(node.right != null) stack.add(node.right);
                TreeNode tmp = node.left;
                node.left = node.right;
                node.right = tmp;
            }
        }
        return root;
    }
}

结果