题解 | #二叉树的镜像#

二叉树的镜像

http://www.nowcoder.com/practice/a9d0ecbacef9410ca97463e4a5c83be7

题目描述

引用内容
操作给定的二叉树,将其变换为源二叉树的镜像。
比如: 源二叉树
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)。

全部评论
这个和栈没关系吧,左右换了,再进栈出栈。顺序正好翻过来了。而且对每个子节点交换左右即可,和出栈顺序没关系吧。 我用队列换了也能通过
2 回复 分享
发布于 2022-02-18 22:20

相关推荐

如题如果提出了一个薪资,A不成功,会有可能被取消offer吗
爱打瞌睡的柯基:最想去你们公司 但是别家开的高一些,希望能申请高一点 不管结果如何都谢谢你
点赞 评论 收藏
分享
10-07 20:48
门头沟学院 Java
不敢追175女神:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
评论
2
4
分享
牛客网
牛客企业服务