• 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 };
  • 相关阅读:
    读书笔记Review: HTTP and HttpServletRequest
    读书笔记JavaScript Patterns_chapter6_Code Reuse Patterns
    读书笔记Review: servlet lifecycle and API
    读书笔记Review: HttpServletResponse
    简单分析Ext.ComponentMgr 函数
    翻译 Extjs in action中的Event flow in the DOM
    struts中的web.xml
    读书笔记_Extjs In Action_The Component Life Cycle
    web service中的事件
    Remoting学习笔记
  • 原文地址:https://www.cnblogs.com/yocichen/p/10906567.html
Copyright © 2020-2023  润新知