题目描述
引用内容
操作给定的二叉树,将其变换为源二叉树的镜像。
比如: 源二叉树
8
/
6 10
/ \ /
5 7 9 11
镜像二叉树
8
/
10 6
/ \ /
11 9 7 5
示例1
输入:
{8,6,10,5,7,9,11}
返回值:
{8,10,6,11,9,7,5}
解法一:递归思想
先交换根节点的左右子树的位置,然后向下递归,把左右子树的根节点作为下次循环的根节点。
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return TreeNode类
*/
public TreeNode Mirror (TreeNode pRoot) {
if(pRoot == null || (pRoot.left == null && pRoot.right == null)){
return pRoot;
}
//先交换根节点的左右子树的位置
TreeNode treeNode = pRoot.left;
pRoot.left = pRoot.right;
pRoot.right = treeNode;
//若左子节点不为null,则进行递归操作
if(pRoot.left != null){
Mirror(pRoot.left);
}
//若右子节点不为null,则进行递归操作
if(pRoot.right != null){
Mirror(pRoot.right);
}
return pRoot;
}
}复杂度分析:
时间复杂度:O(n),因为我们遍历整个输入树一次,所以整个运行时间为O(n),其中n为树中节点的总数。
空间复杂度:递归调用的次数受树的高度限制。在最糟糕的情况下,树是线性的,其高度为O(n)。因此,在最糟糕情况下,由栈上的递归调用造成的空间复杂度为O(n)。
解法二:利用栈结构镜像
除了递归方式,很容易想到先进后出的栈结构,即可使用栈结构遍历所有子节点,并交换每个node的左/右子节点来实现二叉树的镜像。
以下为图简易图解:
代码如下:
public TreeNode Mirror (TreeNode pRoot) {
if(pRoot == null){
return null;
}
//创建辅助栈结构
Stack<TreeNode> myStack = new Stack<>();
//将根结点压入栈内
myStack.push(pRoot);
while(!myStack.isEmpty()){
//根节点弹栈
TreeNode node = myStack.pop();
//如果根结点不为null,则将其左右子树分别压入栈内
if(node.left != null){
myStack.push(node.left);
}
if(node.right != null){
myStack.push(node.right);
}
//然后交换左右子树
TreeNode tmp = node.left;
node.left = node.right;
node.right = tmp;
}
return pRoot;
}
复杂度分析:
时间复杂度:O(n),因为我们遍历整个输入树一次,所以整个运行时间为O(n),其中n为树中节点的总数。
空间复杂度:最差情况下,栈最多同时存储(n+1)/2 个节点,故空间复杂度为O(n)。

京公网安备 11010502036488号