leetcode<102. 二叉树的层序遍历><107. 二叉树的层序遍历 II>

简介: 二叉树编程题解析

image.png

传送门:102. 二叉树的层序遍历

我们都知道,二叉树的层序遍历就是基于BFS算法进行的操作。而这题的层序遍历则要求我们需要以一层为单位输出到vector中。我们不妨在BFS过程中再用一层循环进行约束。使得每次循环队列中只有当前层的节点。因此队列中的数据量便是当前层节点的个数。当前层走完便跳出进入到下一层的循环之中。废话不多说,上代码。

vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> ret;            //返回的vector
        if(!root) return ret;               //空树直接返回
        queue<TreeNode*> q;                 //定义队列
        q.push(root);                       //根节点入队
        while(q.size())                     //BFS循环
        {
            int len = q.size();             //当前层节点的个数
            vector<int> v;                  //用于存储当前节点的vector
            for(int i = 0;i<len;i++)
            { 
                TreeNode* t = q.front();         //获取队头节点
                q.pop();                         //出队
                if(t->left) q.push(t->left);     //子节点入队
                if(t->right) q.push(t->right);
                v.push_back(t->val);             //记录当前节点值
            }
            ret.push_back(v);                //记录当前层的vector
        }
        return ret;
    }

image.gif


image.png

传送门:107. 二叉树的层序遍历 II

与上一题不一样,这题需要我们从最后一个节点开始向上遍历。虽然题目看着有点抽象,但实际上只需要我们将上一题得到的vector反转一下就能够得到正确答案。

vector<vector<int>> levelOrderBottom(TreeNode* root) {
        vector<vector<int>> ret;
        if(!root) return ret;
        queue<TreeNode*> q;
        q.push(root);
        while(q.size())
        {
            int len = q.size();
            vector<int> v;
            for(int i = 0;i<len;i++)
            {
                TreeNode* t = q.front();
                q.pop();
                if(t->left) q.push(t->left);
                if(t->right) q.push(t->right);
                v.push_back(t->val);
            }
            ret.push_back(v);
        }
        reverse(ret.begin(),ret.end());
        return ret;
    }

image.gif

目录
相关文章
|
1月前
|
算法
LeetCode[题解] 1261. 在受污染的二叉树中查找元素
LeetCode[题解] 1261. 在受污染的二叉树中查找元素
16 1
|
1月前
力扣面试经典题之二叉树
力扣面试经典题之二叉树
16 0
|
2天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
3天前
|
算法
【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历
【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历
|
1月前
leetcode热题100.二叉树中的最大路径和
leetcode热题100.二叉树中的最大路径和
17 0
|
1月前
leetcode热题100. 二叉树的最近公共祖先
leetcode热题100. 二叉树的最近公共祖先
20 0
|
1月前
LeetCode-二叉树OJ题
LeetCode-二叉树OJ题
18 0
|
1月前
|
API
Leetcode-二叉树oj题
Leetcode-二叉树oj题
15 0
Leetcode-二叉树oj题
|
1月前
|
存储 Serverless 索引
二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历【LeetCode刷题日志】
二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历【LeetCode刷题日志】
|
2月前
【Leetcode 2583】二叉树中的第K大层和 —— 优先队列 + BFS
解题思路: - 使用队列保存节点,按层序依次保存该层节点 - 使用优先队列保存每层节点值的总和,最后剔除前k个大数即可得到