zoukankan      html  css  js  c++  java
  • 剑指 Offer 32

    思路

    方法一:辅助队列保存对应层数

    我们可以用广度优先搜索解决这个问题。

    我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。

    最后根据每个点的 level 对点进行分类,分类的时候我们可以利用哈希表,维护一个以 level 为键,对应节点值组成的数组为值,广度优先搜索结束以后按键 level 从小到大取出所有值,组成答案返回即可。

    但是这里已经TreeNode结构已经被LeetCode内部定死了,修改不了,所以可以使用一个额外的队列专门保存层数。

     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  */
    10 class Solution {
    11 public:
    12     vector<vector<int>> levelOrder(TreeNode* root) {
    13         vector<vector<int>> res;
    14         if(root == NULL)
    15             return res;
    16         
    17         //使用2个队列
    18         //队列A:存储节点
    19         //队列B:存储节点所在层数
    20         queue<TreeNode *> A;
    21         queue<int> B;
    22 
    23         A.push(root);
    24         B.push(0);
    25 
    26         vector<int> v;
    27         int currentLevel = 0;
    28 
    29         while(!A.empty() && !B.empty()) {
    30             TreeNode *t = A.front();
    31             A.pop();
    32 
    33             int level = B.front();
    34             B.pop();
    35 
    36             if(level > currentLevel) {
    37                 currentLevel++;
    38                 res.push_back(v);
    39                 v.clear();
    40             } 
    41 
    42             v.push_back(t->val);
    43 
    44             if(t->left) {
    45                 A.push(t->left);
    46                 B.push(level+1);
    47             }
    48 
    49             if(t->right) {
    50                 A.push(t->right);
    51                 B.push(level+1);
    52             }
    53 
    54         }
    55 
    56         res.push_back(v);
    57 
    58         return res;
    59     }
    60 };

    方法二:当前层循环打印

    当前层循环打印: 循环次数为当前层节点数(即队列 queue 长度);
    在添加子节点之前,先保存当前队列的长度qsize,循环出队并打印qsize次就能打印当前层的所有元素。

     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  */
    10 class Solution {
    11 public:
    12     vector<vector<int>> levelOrder(TreeNode* root) {
    13         vector<vector<int>> res;
    14         if(root == NULL)
    15             return res;
    16 
    17         queue<TreeNode *> Q;
    18         Q.push(root);
    19 
    20         while(!Q.empty()) {
    21             vector<int> v;
    22             int qsize = Q.size();
    23 
    24             for(int i = 0; i < qsize; ++i) {
    25                 TreeNode *t = Q.front();
    26                 Q.pop();
    27                 v.push_back(t->val);
    28 
    29                 if(t->left)
    30                     Q.push(t->left);
    31                 if(t->right)
    32                     Q.push(t->right);
    33             }
    34 
    35             res.push_back(v);
    36         }
    37 
    38         return res;
    39     }
    40 };

    复杂度分析

  • 相关阅读:
    Attach Files to Objects 将文件附加到对象
    Provide Several View Variants for End-Users 为最终用户提供多个视图变体
    Audit Object Changes 审核对象更改
    Toggle the WinForms Ribbon Interface 切换 WinForms 功能区界面
    Change Style of Navigation Items 更改导航项的样式
    Apply Grouping to List View Data 将分组应用于列表视图数据
    Choose the WinForms UI Type 选择 WinForms UI 类型
    Filter List Views 筛选器列表视图
    Make a List View Editable 使列表视图可编辑
    Add a Preview to a List View将预览添加到列表视图
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/13909092.html
Copyright © 2011-2022 走看看