题目描述
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
这道题从给出的例子可以清楚地看出来,镜像二叉树就是将二叉树的左右子树调换位置。这道题很容易想到递归,但是递归问题最困难的就是逻辑,如果光靠脑袋想容易把脑袋想破,所以遇到递归问题建议大家画图。这道题目大家很容易想到就是将左右子节点调换,这里面容易犯两个错误:
(1)就是不能直接root.left = root.right; root.right= root.left;因为当root.left = root.right的时候,树其实已经变成{8,10,10,9,11,9,11}
(2)将左节点和右节点调换的时候,不光是10和6两个节点调换,其实连同它们的子节点都调换了,第一次调换后树其实已经变成{8,10,6,9,11,5,7}
最后要注意递归一定要有出口
之后就是代码了,前序遍历:
代码:
public class Solution {
public void Mirror(TreeNode root) {
if(root == null){
return;
}
if(root.left == null && root.right == null){
return;
}//递归出口
TreeNode resultLeft = root.left;
TreeNode resultRight = root.right;//可以只用一个变量进行交换,为了清楚
root.left = resultRight;
root.right = resultLeft;//交换左右子树,注意看我说的第二个问题
if(root.left != null){
Mirror(root.left);
}//递归左子树
if(root.right != null){
Mirror(root.right);
}//递归右子树
}
}