题解 | #二叉树的镜像#

二叉树的镜像

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

描述

操作给定的二叉树,将其变换为源二叉树的镜像。

思路1:广度优先遍历

使用栈

使用栈进行层序遍历:从左往右加入,弹出的时候变成从右往左。再交换左右节点

  1. 8入栈
  2. 弹出8。将6和10入栈
  3. 交换6和10
  4. 弹出10。将9和11入栈
  5. 交换9和11
  6. 弹出6。将5和7入栈
  7. 交换5和7
public class Solution {
    public TreeNode Mirror (TreeNode pRoot) {
        if(pRoot == null) {
            return pRoot;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(pRoot);
        while(!stack.isEmpty()) {
            TreeNode node = stack.pop();
            if(node.left != null) {
                stack.push(node.left);
            }
            if(node.right != null) {
                stack.push(node.right);
            }
            TreeNode tmp = node.left;
            node.left = node.right;
            node.right = tmp;
        }
        return pRoot;
    }
}

使用队列

也可以使用队列,从右往左入队,交换左右节点。

public class Solution {
    public TreeNode Mirror (TreeNode pRoot) {
        if(pRoot == null) {
            return pRoot;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(pRoot);
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if(node.right != null) {
                queue.offer(node.right);
            }
            if(node.left != null) {
                queue.offer(node.left);
            }
            TreeNode tmp = node.left;
            node.left = node.right;
            node.right = tmp;
        }
        return pRoot;
    }
}

思路2:深度优先遍历

本质是访问每个节点,然后交换左右节点,因此二叉树的多种遍历方式都可以实现。

深度优先遍历:递归左子树和右子树,交换左右子树。

前序遍历

public class Solution {
    public TreeNode Mirror (TreeNode pRoot) {
        if(pRoot == null) {
            return null;
        }
        //交换左右子树
        TreeNode tmp = pRoot.right;
        pRoot.right = pRoot.left;
        pRoot.left = tmp;
        //递归左右子树
        Mirror(pRoot.left);
        Mirror(pRoot.right);
        return pRoot;
    }
}

后序遍历

public class Solution {
    public TreeNode Mirror (TreeNode pRoot) {
        if(pRoot == null) {
            return null;
        }
        //返回左子树的根节点
        TreeNode left = Mirror(pRoot.left);
        //返回右子树的根节点
        TreeNode right = Mirror(pRoot.right);
        //交换左右子树
        pRoot.left = right;
        pRoot.right = left;
        return pRoot;
    }
}

中序遍历

递归左子树和右子树,再交换父节点的左右节点

public class Solution {
    public TreeNode Mirror (TreeNode pRoot) {
        if(pRoot == null) {
            return null;
        }
        Mirror(pRoot.left);
        //交换左右节点
        TreeNode tmp = pRoot.right;
        pRoot.right = pRoot.left;
        pRoot.left = tmp;
        //由于左右节点已经交换,因此这里传入的还是左节点
        Mirror(pRoot.left);
        return pRoot;
    }
}

思路3:递归重建二叉树

新建一棵二叉树B,递归遍历树A

public class Solution {
    public TreeNode Mirror (TreeNode pRoot) {
        if(pRoot == null) {
            return null;
        }
        TreeNode ret = new TreeNode(pRoot.val);
        dfs(pRoot, ret);
        return ret;
    }
    void dfs(TreeNode node1, TreeNode node2) {
        if(node1 == null) {
            return;
        }
        if(node1.right != null) {
            node2.left = new TreeNode(node1.right.val);
        }
        if(node1.left != null) {
            node2.right = new TreeNode(node1.left.val);
        }
        dfs(node1.left, node2.right);
        dfs(node1.right, node2.left);
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-21 11:33
昨天是学校最后一场招聘会,鼠鼠去参加了,全场只有一个招聘java的岗位,上来先做一份笔试题,做完后他拿张纸对答案,然后开始问简历上的问题,深圳小厂,6-8k(题目如下),后面还有两轮面试。然后我就在招聘现场逛呀逛,看到有公司招聘电商运营,给的比上年的小厂还多,鼠鼠就去了解了下,然后hr跟鼠鼠要了份简历,虽然我的简历上面全是求职Java开发相关的内容,但是hr还是鼓励我说没关系,她帮我把简历给老板看看,下周一会给我通知。招聘会结束后鼠鼠想了一段时间,也和朋友聊了聊,发现我可能是不太适合这个方向,然后就跟爸爸说回家了给我发条微信,我有些话想跟他说说。晚上爸爸到家了,跟我发了条微信,我立马跑出图书馆跟他打起了电话,这个通话长达一个小时,主要是跟爸爸坦白说我不想找这行了,是你的儿子太没用了,想试试其他行业。然后爸爸也跟我说了很多,说他从来没有希望我毕业后就赚大钱的想法,找不到就回家去,回家了再慢慢找,实在找不到就跟他干(帮别人装修房子,个体户),他也知道工作不好找,让我不要那么焦虑,然后就是聊一些家常琐事。对于后面的求职者呢我有点建议想提一下,就是如果招实习的时间或者秋招开始,而你的简历又很差的情况下,不要说等做好项目填充完简历之后再投,那样就太晚了,建议先把熟悉的项目写上简历,然后边投边面边完善,求职是一个人进步的过程,本来就比别人慢,等到一切都准备好后再投岂不是黄花菜都凉了。时间够的话还是建议敲一遍代码,因为那样能让你加深一下对项目的理解,上面那些说法只是针对时间不够的情况。当然,这些建议可能没啥用,因为我只是一个loser,这些全是建立在我理想的情况下,有没有用还需其他人现身说法。上篇帖子没想到学校被人认了出来,为了不丢脸只能匿名处理了。
KPLACE:找研发类或技术类,主要还是要1.多投 2.多做准备,很多方面都要做准备 3.要有心理准备,投累了就休息一两天,再继续,要相信自己能找到
投递58到家等公司7个岗位
点赞 评论 收藏
分享
刷到其他牛友的面经,这是什么面试题&nbsp;咋还问这个
爱睡觉的冰箱哥:问出这种问题的公司有人去的是这个
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务