题解 | #求二叉树的层序遍历#

求二叉树的层序遍历

http://www.nowcoder.com/practice/04a5560e43e24e9db4595865dc9c63a3

使用递归方法,声明一个全局二维数组来保存遍历结果,以根结点为第0层,每次递归都使层数++,并在对应层数插入结点值。
由于结果集最初为空,需要随着层数的加深不断向其中加入新数组。由于使用层数进行插入,所以只需让层数与size进行比较,两者相等则说明层数越界,要想结果集中加入新数组。

这里有个小坑,算是基础不牢。最开始写的递归函数设了三个参数,有两个是现在的层数level和二叉树结点指针p,还有一个参数是结果集二维数组,发现结果不正确。调试查找原因是因为直接将结果集作为递归参数使用传值方式传入,出错。应将结果集的引用传入,或简单粗暴,直接将结果集写死写入函数中。

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int>> v;
    vector<vector<int> > levelOrder(TreeNode* root) {
        // write code here
        if(root == NULL){
            return v;
        }
        go(0,root);
        return v;
    }
    void go(int level, TreeNode* p){
        if(v.size() == level){
            vector<int> blank;
            v.push_back(blank);
        }
        v.at(level).push_back(p->val);
        if(p->left != NULL){
            go(level+1, p->left);
        }
        if(p->right != NULL){
            go(level+1,p->right);
        }
    }
    
};
全部评论
借楼:不想开通博客!觉得我的算法思路也很好。两个queue。 /** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ class Solution { public: /** * * @param root TreeNode类 * @return int整型vector<vector><>> */ vector<vector><int> > levelOrder(TreeNode* root) { // write code here vector<vector><int>> res; vector<int> tmp; queue<treenode> oldQ; queue<treenode> newQ; if (root != nullptr) oldQ.push(root); while (!oldQ.empty() || !newQ.empty()) { if (!oldQ.empty()) { auto node = oldQ.front(); cout << node->val << " "; oldQ.pop(); tmp.push_back(node->val); if (node->left != nullptr) newQ.push(node->left); if (node->right != nullptr) newQ.push(node->right); } else { res.push_back(tmp); tmp.clear(); oldQ.swap(newQ); } } if (!tmp.empty()) res.push_back(tmp); return res; } };</treenode></treenode></int></int></vector></int></vector></vector>
点赞 回复 分享
发布于 2021-10-16 14:44

相关推荐

投递拓竹科技等公司10个岗位
点赞 评论 收藏
分享
07-09 20:50
门头沟学院 Java
码农索隆:1.教育背景和荣誉证书合二为一。 2.获奖项目理一遍,你做了什么,对你求职的岗位有什么帮助,没有就删掉。 3.技能特长和教育背景交换位置。 4.技能特长写的太差,上网上找简历参考。都不用问你别的,一个redis就能把你问住,写写你具体会redis哪些方面的知识。
点赞 评论 收藏
分享
评论
6
2
分享

创作者周榜

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