• LeetCode102 二叉树的层次遍历


    题目描述:

    给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

    例如:
    给定二叉树: [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7
    

    返回其层次遍历结果:

    [
      [3],
      [9,20],
      [15,7]
    ]



    
    
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    /*
    算法思想:
        进行常规层次遍历,需要借助一个队列。
        先将根节点入队,然后出队,访问该结点,如果它有左子树,则将左子树根节点入队;若果它有右子树,则将右子树根结点入队。然后出队,访问该结点,如此反复,直至队列为空。
    补充:
    queue 的基本操作有:
    入队,如例:q.push(x); 将x 接到队列的末端。
    出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
    访问队首元素,如例:q.front(),即最早被压入队列的元素。
    访问队尾元素,如例:q.back(),即最后被压入队列的元素。
    判断队列空,如例:q.empty(),当队列空时,返回true。
    访问队列中的元素个数,如例:q.size()
    */
    class Solution {
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            
            vector<vector<int>>v;
            
            queue<TreeNode*>q;  //---
            q.push(root);  //根节点入队---
            
            if(root == NULL)  
                return v ;
            while(!q.empty()){  //队列不空
                vector<int>vv;
                queue<TreeNode*> next ;  //  建立第二个队列 用来存放下一层的结点
                while(!q.empty()){  //遍历当前层的结点  这层循环是核心 其他都是为了满足OJ二维向量输出---
                    
                    TreeNode* tre = q.front() ;
                    vv.push_back(tre->val);  //访问该结点,为了满足输出要求,所以有点复杂,
                    q.pop();  //对头元素出队
                    if(tre->left!=NULL){  //它有左子树
                        next.push(tre->left);
                    }
                    if(tre->right!=NULL){  //它有右子树
                        next.push(tre->right);
                    }
                    
                }   //---
                v.push_back(vv);
                q=next;  // // 遍历完后进入下一层 
            }
            return v;
        }
    };
  • 相关阅读:
    防抖函数
    锁屏功能
    配置编译环境和线上环境之间的切换
    vue-router中的滚动行为
    axios的再次封装
    Anaconda 镜像配置
    Python 包管理工具 pip 与 conda
    Anaconda 安装与卸载
    VS Code 配置和使用
    解决 VS Code 无法使用Ctrl+C等快捷键
  • 原文地址:https://www.cnblogs.com/parzulpan/p/9924684.html
Copyright © 2020-2023  润新知