解题思路:递归
遇到关于链表与二叉树的相关问题时,我们都要考虑递归是否可以解决,因为这两种数据结构本身就带有递归性质。譬如:二叉树的前序,中序,后序遍历都可以使用递归算法完成。
递归算法需要明确两个目标:
- 返回条件。如果没有设定递归中止条件,就会造成栈溢出
- 递推算法。我们需要明确如何将一个大问题划分成规模更小的子问题
在本题中:
- 返回条件:当节点 root 为空时,即返回 null
- 递推算法:


图一为原二叉树,图二为二叉树的镜像;不难找出递推关系;输入原二叉树的根节点,对其进行镜像翻转其结果等价于:对根节点的右子树进行镜像翻转,再对根节点的左子树进行镜像翻转,最后让原左子树和原右子树调换位置,使其变成根节点的左子树和右子树。```java TreeNode left = mirrorTree(root.right); TreeNode right = mirrorTree(root.left);
root.left = left; root.right = right;
<a name="06e004ef"></a>#### 代码_Java_```java/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/class Solution {public TreeNode mirrorTree(TreeNode root) {if(root == null){return null;}TreeNode left = mirrorTree(root.right);TreeNode right = mirrorTree(root.left);root.left = left;root.right = right;return root;}}
复杂度分析
- 时间复杂度:O(N)
N 为二叉树的节点个数,建立二叉树镜像需要遍历二叉树所有的节点,所以时间复杂度为:O(N) - 空间复杂度:O(N)
空间复杂度为递归栈的深度,最差的情况即:当一个二叉树退化为链表,此时需要的额外空间为:O(N)
