二叉树的镜像

二叉树的镜像

http://www.nowcoder.com/questionTerminal/564f4c26aa584921bc75623e48ca3011

描述

这是一篇适合初级学者的题解。这里提供2种方法。
知识点:树,递归
难度:一星


题解

题目抽象:给定一颗二叉树,将二叉树的左右孩子进行翻转,左右孩子的子树做相同的操作。

方法一:递归版本

根据题意,如果我们知道一个根节点的左孩子指针和右孩子指针,那么再改变根节点的指向即可解决问题。
也就是,需要先知道左右孩子指针,再处理根节点。显然对应遍历方式中的后序遍历。
后序遍历的模板:

void postOrder(TreeNode *root) {
    if (!root) return;
    postOrder(root->left); // left child
    postOrder(root->right); // right child
    // process root
}   

这里展示一个例子:
![图片说明](https://uploadfiles.nowcoder.com/images/20200418/284295_1587184260451_6FEC856A9DD1E83B09780CBFB41A3862 "图片标题")

代码

class Solution {
public:
    TreeNode* dfs(TreeNode *r) {
        if (!r) return nullptr;
        TreeNode *lval = dfs(r->left);
        TreeNode *rval = dfs(r->right);
        r->left = rval, r->right = lval;
        return r;
    }
    void Mirror(TreeNode *pRoot) {
        if (!pRoot) return;
        dfs(pRoot);
    }
};

时间复杂度:O(n),n为树节点的个数。每个节点只用遍历一次,所以为O(n)
空间复杂度:O(n), 每个节点都会在递归栈中存一次

方法二:非递归版本

方法一种的递归版本中遍历树的方法用的是后序遍历。所以非递归版本,只需要模拟一次树遍历。
这里模拟树的层次遍历。
层次遍历的模板为:

void bfs(TreeNode *root) {
    queue<TreeNode*> pq;
    pq.push(root);
    while (!pq.empty()) {
        int sz = pq.size();
        while (sz--) {
            TreeNode *node = pq.front(); pq.pop();
            // process node, ours tasks
            // push value to queue
            if (node->left) pq.push(node->left);
            if (node->right) pq.push(node->right);

        } // end inner while
    } // end outer while
}

所以我们的代码为;

class Solution {
public:
    void Mirror(TreeNode *pRoot) {

        queue<TreeNode*> pq;
        pq.push(pRoot);
        while (!pq.empty()) {
            int sz = pq.size();
            while (sz--) {
                TreeNode *node = pq.front(); 
                pq.pop();

                if (node->left) pq.push(node->left);
                if (node->right) pq.push(node->right);
                // our tasks
                TreeNode *cur = node->left; // 需要保存一下
                node->left = node->right;
                node->right = cur;


            } // end inner while

        } // end outer while
    }
};

时间复杂度:O(n),n为树节点的个数。每个节点只用遍历一次,所以为O(n)
空间复杂度:O(n)

全部评论

相关推荐

07-10 11:08
门头沟学院 Java
投递京东等公司9个岗位
点赞 评论 收藏
分享
Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 11:45
你不要过来啊啊啊啊啊啊啊
码农索隆:对面:“今天你不面也得面”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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