zoukankan      html  css  js  c++  java
  • leetcode-102.层序遍历二叉树(正序)· BTree

    题面

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

    层序遍历二叉树,要求从上到下,从左到右,输出结果为二维vector。

    样例

    Given binary tree [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7
    

    return its level order traversal as:

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

    算法

    想法:还记得怎么进行层序遍历吗?结果是一个一维数组。现在的情景是要把每一层用一个单独的vector存起来,仅此而已。那么我们的首要问题就是,怎么解决“一层”的问题。

    其实,我们在处理完上一层时,queue中就会只包含有本层的节点指针,那么我们计算queue.size(),然后只处理queue的前queue.size()个元素不就可以了吗?在处理其中每一个元素的时候,判空。非空的话,值压入vector,然后把左孩子和有孩子都再次压入queue,最后queue.pop()。处理完这一层,就把当前vector整个压入结果vector<vector<int>> res 中。

    1. 根节点判空,若空,返回空vector<vector<int>> (); 不空,继续

    2. 新建queue<TreeNode*> q, 和结果vector<vector<int>> res,根节点压入q中

    3. 若q非空,while循环判断

    新建vector。计算q元素个数,即为一层节点,逐个判空,若不空,值压入vector。然后把子节点压入q中,然后把它弹出queue。

    处理完这层,若vector不空,整个压入res中。

    4. 返回 res 结束。

    源码

    1 /**
    2  * Definition for a binary tree node.
    3  * struct TreeNode {
    4  *     int val;
    5  *     TreeNode *left;
    6  *     TreeNode *right;
    7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    8  * };
    9  */
     1 class Solution {
     2 public:
     3     vector<vector<int>> levelOrder(TreeNode* root) {
     4         //层序遍历
     5         if(root == nullptr)
     6             return vector<vector<int>> ();
     7         
     8         vector<vector<int>> res;
     9         queue<TreeNode*> q;
    10         q.push(root);
    11         while(!q.empty())
    12         {
    13             int size = q.size();
    14             vector<int> tmp;
    15             while(size--)
    16             {
    17                 TreeNode* p = q.front();
    18                 if(p != nullptr)
    19                 {
    20                     tmp.push_back(p->val);
    21                     q.push(p->left);
    22                     q.push(p->right);
    23                 }
    24                 q.pop();
    25             }
    26             if(tmp.size() != 0)
    27                 res.push_back(tmp);
    28         }
    29         return res;
    30     }
    31 };
  • 相关阅读:
    RABBITMQ/JAVA 客户端测试(再补:利用文件流)
    在虚拟机中安装CentOS7
    RabbitMQ/JAVA 客户端测试(补:利用线程)
    ffmepg-nginx-nginx-rtmp-module配置脚本
    PDO防注入原理分析以及使用PDO的注意事项
    使用MySQL Proxy解决MySQL主从同步延迟
    好文收藏
    CentOS6.6安装mysql出现的问题
    大型网站技术架构相关文章
    Redis必要的一些配置
  • 原文地址:https://www.cnblogs.com/yocichen/p/10906567.html
Copyright © 2011-2022 走看看