剑指 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
注意:本题与主站 226 题相同:https://leetcode-cn.com/problems/invert-binary-tree/
递归算法思考步骤
首先,分解子问题,将大问题分解成子问题作为递归项来进行递归。
第一步原理,在做递归时,第一步很重要,将第一步与其他步骤分为两类。将子问题变成与大问题形式相同,规模缩小的问题,形成递归。
其次,找到子问题与大问题之间关系,形成递归表达式。
最后,为防止无穷递归,需给出边界条件,当传入的递归项为零时返回值,既作为边界,又作为递归算法每次递归的结果。
解题思路
用递归的方法,对传入的树按照左子树和右子树递归,即分割成更小的规模
为了防止递归函数报错,一开始就要判断当前树是否为空,如果空的话就返回null到上一层,并把这个树接到上一层树的另一分支。
当两个分支的交换完成时,用一个return函数把当前树返回到上一层,上一层又有相应的函数,会把左右节点交换好的当前子树分给父节点的另一边
每个树都要交换它的子树
对应的,每个子树也要交换它的子树
哪怕这个树的两个子树都是空,那也可以进行交换
当这个树本身为空时,说明该退出递归了
最后的最后,当这棵子树的交换完成时,return root,把这棵子树回退到上一层递归
代码实现
package main;
//请完成一个函数,输入一个二叉树,该函数输出它的镜像。(将每个节点的左子树和右子树交换)
// 例如输入:
// 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]
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
class Solution {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public TreeNode mirrorTree(TreeNode root) {
//从树的根节点往下递归遍历,每次递归都使这个树的规模变小
//第一次函数的root是整棵树,将树的左右子树交换,并进行递归
//第二行的函数就是 root.right和root.left,分别给root的左子树和右子树
//第三行那就是在子树里面递归了
if (root == null)
return null;
TreeNode tmpNode = root.left;
root.left = mirrorTree(root.right);
root.right = mirrorTree(tmpNode);
return root;
}
public static void main(String[] args) {
TreeNode t=new TreeNode(1);
TreeNode r=new TreeNode(3);
TreeNode l=new TreeNode(2);
t.left=l;
t.right=r;
Solution solution=new Solution();
solution.mirrorTree(t);
}
}