Leetcode102. Binary Tree Level Order Traversal

链接

link

思路

二叉树层序遍历
广度优先
先在队列中加入根结点。之后对于任意一个结点来说,在其出队列的时候,访问之。同时如果左孩子和右孩子有不为空的,入队列。

cpp

我自己想出来的思路就是,求出每一层的节点,然后根据每一层的节点,更新下一层的节点,再找出节点相对应的值。
真的好麻烦,而且一堆bug,不简洁优雅,不写了。
参考别人的思路,是把二维数组的每个数组,在每一层,分别添加。而不是一起做。所以好像简单一点。
这样知道是哪一层的,然后再往相应层添加元素,真的很方便。

1.递归

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        level_order(res, 0, root);
        return res;
    }
    void level_order(vector<vector<int>> &res, int level, TreeNode *root){
        if(root == NULL){
            return ;
        }
        if (res.size() < level + 1) res.resize(level + 1);
        //为结果增加一个数组,因为这里没法用push_back()
        res[level].push_back(root->val);
        level_order(res, level + 1, root->left);
        level_order(res, level + 1, root->right);
    }
};

2.

看了别人的思路,不就是前面我想出来的迭代算法吗2333.不过已经删了,看别的人又重写一遍。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        if(root == NULL){
            return res;
        }
        vector<TreeNode *> q;
        q.push_back(root);
        int level = 0;
        while(!q.empty()){
            res.push_back(vector<int>());
            auto sz = q.size();
            for(auto i = 0; i < sz; i++){
                auto t = q.front();
                q.erase(q.begin());
                res[level].push_back(t->val);
                if (t->left != NULL) q.push_back(t->left);
                if (t->right != NULL) q.push_back(t->right);
            }
            level++;
        }
        return res;
    }
};

注意这里必须在for之前记下数组的大小,因为在循环过程中会对数组进行删除操作,所以可能数组大小会改变。这里直接从前面删除指定个元素,然后把新元素添加到后面即可。不用再来一个新的tem数组。
这个方法时间空间上效率都很高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值