[4]基础数据结构,二叉树的层次遍历

二叉树的层次遍历

题目链接:
https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/
部分参考于:
https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/solution/er-cha-shu-de-ceng-ci-bian-li-ii-by-leetcode-solut/

意义

实际上,任何树的层次遍历都用到这个模板。只需要在node->left和node->right方面修改一下即可。本题目用到的是BFS,感觉这个方法还是很妙的。

算法与数据结构

BFS和单调队列。

函数

基本都是概念性的函数,q.pop()弹出队首元素,栈用push_back(),队列用push。

实现

注释于题解旁边。

/**
 * 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>> levelOrderBottom(TreeNode* root) {
    
    
        auto levelOrder = vector<vector<int>>();
        if (!root) {
    
    
            return levelOrder;//若为空树,则返回空
        }
        queue<TreeNode*> q;//树的节点集合
        q.push(root);//首先放入根节点
        while (!q.empty()) {
    
    
            auto level = vector<int>();
            int size = q.size();//代表每一层有多少个节点
            for (int i = 0; i < size; ++i) {
    
    
                auto node = q.front();//BFS的关键
                q.pop();//弹出当前的队首元素
                level.push_back(node->val);//把数字放进去
                if (node->left) {
    
    //为下一次BFS做准备
                    q.push(node->left);
                }
                if (node->right) {
    
    
                    q.push(node->right);
                }
            }
            levelOrder.push_back(level);//当前层就完结了
        }
        reverse(levelOrder.begin(), levelOrder.end());//最后逆序处理一下
        return levelOrder;
    }
};


默写一下:

/**
 * 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>> levelOrderBottom(TreeNode * root){
    
    
        auto levelOrder=vector<vector<int>>();
        if(!root){
    
    
            return levelOrder;
        }
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()){
    
    
            auto level=vector<int>();
            int size=q.size();
            for(int i=0;i<size;i++){
    
    
                auto node=q.front();
                q.pop();
                level.push_back(node->val);
                if(node->left){
    
    
                    q.push(node->left);
                }
                if(node->right){
    
    
                    q.push(node->right);
                }
            }
            levelOrder.push_back(level);
        }
        reverse(levelOrder.begin(),levelOrder.end());
        return levelOrder;
    }

} ;

猜你喜欢

转载自blog.csdn.net/weixin_47741017/article/details/108439056