题目
请完成一个函数,输入一颗二叉树,该函数出处它的镜像。二叉树的节点定义如下
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;
}