题解 | #二叉树的后序遍历#

二叉树的后序遍历

http://www.nowcoder.com/practice/1291064f4d5d4bdeaefbf0dd47d78541

题意

给定一个二叉树,返回他的后序遍历的序列。

范围:

节点数不大于100

方法

递归遍历树

按题意所说,通过递归遍历树来获得其后续遍历

每次先遍历左子树,再右子树,最后根

以题目样例为例

递归层级 左子树 右子树 数组
0 null 1 {2,3} {}
1 {3} 2 null {}
2 null 3 null {}
1 {3} 2 null {3}
0 null 1 {2,3} {3,2}
- - - - {3,2,1}

代码

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    vector<int> dfs(TreeNode * r){
        if(r == nullptr)return {};
        auto ln = dfs(r->left); // 获取左侧
        auto rn = dfs(r->right); // 获取右侧
        ln.insert(ln.end(),rn.begin(),rn.end()); // 合并左右
        ln.push_back(r->val);
        return ln;
    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型vector
     */
    vector<int> postorderTraversal(TreeNode* root) {
        return dfs(root);
    }
};

复杂度分析

时间复杂度: 对树上每个节点操作次数为常数次,但合并树每次插入是子树节点个数,所以时间复杂度为O(n2)O(n^2)

空间复杂度: 主要在记录结果的数组,空间复杂度为O(n)O(n)

引用优化合并

如果能降低每次两数组合并的代价,甚至不需要合并就好了

利用C++提供的引用,让所有的输出直接添加到最终的数组里,而不是传给父函数去合并,这样每次直接写在了最终的输出位置

代码

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    void dfs(vector<int>&res,TreeNode * r){ // 递归
        if(r == nullptr)return; // 处理空
        dfs(res,r->left); // 处理左子树
        dfs(res,r->right); // 处理右子树
        res.push_back(r->val); // 处理根
    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型vector
     */
    vector<int> postorderTraversal(TreeNode* root) {
        // write code here
        vector<int> res = {};
        dfs(res,root);
        return res;
    }
};

复杂度分析

时间复杂度: 对树上每个节点操作次数为常数次,所以时间复杂度为O(n)O(n)

空间复杂度: 主要在记录结果的数组,空间复杂度为O(n)O(n)

全部评论

相关推荐

09-16 16:47
门头沟学院 C++
点赞 评论 收藏
分享
从明天开始狠狠卷JV...:叽里咕噜一大堆,不就是字典序,sort一下就搞定了。
投递京东等公司10个岗位
点赞 评论 收藏
分享
xiaolihuam...:当然还有一种情况是你多次一面挂,并且挂的原因都比较类似,例如每次都是算法题写不出来。面试官给你的评价大概率是算法能力有待加强,算法能力有待提高,基础知识掌握的不错,项目过关,但是coding要加强。短期内高强度面试并且每次都是因为同样的原因挂(这个你自己肯定很清楚),会形成刻板印象,因为你偶尔一次算法写不出来,面试官自己也能理解,因为他清楚的知道自己出去面试也不一定每一次面试算法都能写出来。但是连续几次他发现你的面屏里面都是算法有问题,他就认为这不是运气问题,而是能力问题,这种就是很客观的评价形成了刻白印象,所以你要保证自己。至少不能连续几次面试犯同样的错。算法这个东西比较难保证,但是有些东西是可以的,例如某一轮你挂的时候是因为数据库的索引,这个知识点答的不好,那你就要把数据库整体系统性的复习,下一轮面试你可以,项目打的不好,可以消息队列答的不好,但是绝对不可以数据库再答的不好了。当然事实上对于任何面试都应该这样查漏补缺,只是对于字节来说这个格外重要,有些面试官真的会问之前面试官问过的问题
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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