剑指offer | 面试题27:二叉树的镜像

转载本文章请标明作者和出处
本文出自《Darwin的程序空间》
本文题目和部分解题思路来源自《剑指offer》第二版

在这里插入图片描述

开始行动,你已经成功一半了,献给正在奋斗的我们

题目

请完成一个函数,输入一颗二叉树,该函数出处它的镜像。二叉树的节点定义如下

public class TreeNode {

    public int val;

    public TreeNode left;

    public TreeNode right;

    public TreeNode(int x) {
        val = x;
    }
}

对有些同学来说,镜像的概念可能比较新,如下,两个二叉树就互为镜像二叉树;
在这里插入图片描述

解题分析

做这道题,如果想不明白的话,我们可以画图看看实例中的第一个二叉树怎么可以变成第二个;

我们先试着交换一下根节点8的左右节点,因为看两幅图8节点的两个子节点6、10是反的;

在这里插入图片描述
有点像了,对比一下两幅图片,好像就差10、6的子节点是反的了,再交换一下这两个节点的子节点看一下;
在这里插入图片描述
结果即为答案,那么我们可以大胆的推测,获取镜像二叉树,就是把二叉树里面所有节点的左右节点互换即可

思想有了,然后就是实现的手段,手段可能有很多,常规的递归,你也可以用一个队列依次交换节点的左右节点;这都不重要了,重要的是你要把它实现出来;

代码(JAVA实现)

ps:这里笔者使用的jdk为1.8版本

测试数据即为图示数据;

public class Offer27_MirrorTree {

    public static void main(String[] args) {
        TreeNode root = new TreeNode(8);
        TreeNode t1 = new TreeNode(6);
        TreeNode t2 = new TreeNode(10);
        TreeNode t3 = new TreeNode(5);
        TreeNode t4 = new TreeNode(7);
        TreeNode t5 = new TreeNode(9);
        TreeNode t6 = new TreeNode(11);

        root.left = t1;
        root.right = t2;
        t1.left = t3;
        t1.right = t4;
        t2.left = t5;
        t2.right = t6;

        mirrorTree(root);
        System.out.println();
    }

    public static TreeNode mirrorTree(TreeNode root) {
        if (Objects.isNull(root)) {
            return null;
        }
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        mirrorTree(root.left);
        mirrorTree(root.right);
        return root;
    }
}

代码的执行流程

我们可以想一下上面的代码是怎么执行的?

首先,root节点进入函数,也就是节点8,判断不为空,于是交换节点6,节点10两个节点;
然后用左节点为参数继续调用函数,这是的左节点已经是节点10,节点10进入函数不为空,交换左右节点,节点11和节点9
然后节点11进入函数,交换一下左右节点(其实都为空,交换了一下空气),然后把左右空节点都再进入循环一次,但是都被打出;
然后节点9进入循环,和节点11一样,实际上没有变化;
然后节点6进入函数,同节点10,交换节点5和节点7,再交换一下并不存在的两个节点的左右节点,最后完成交换,返回root节点8;

如果我们逻辑没有问题的话,我们想一下如果在这打印一个输出,输出结果会是多少

在这里插入图片描述


这里如果分析没错的话,结果会是:
【8、10、11、9、6、7、5】

我们打印一下答案:
在这里插入图片描述
最后,队列实现的代码也附上;(如果有小伙伴想学习又看不明白,可以联系我,我再写教程)

public TreeNode invertTree(TreeNode root) {
    if (root == null) return null;
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    queue.add(root);
    while (!queue.isEmpty()) {
        TreeNode current = queue.poll();
        TreeNode temp = current.left;
        current.left = current.right;
        current.right = temp;
        if (current.left != null) queue.add(current.left);
        if (current.right != null) queue.add(current.right);
    }
    return root;
}
喜欢的朋友可以加我的个人微信,我们一起进步
发布了156 篇原创文章 · 获赞 19 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qq_36929361/article/details/104375451