zoukankan      html  css  js  c++  java
  • leetcode

    题目:Binary Tree Level Order Traversal i ii

    i和ii的差别仅在于最后将结果逆序一下就行了,算法上基本相同

    个人思路:

    1、二叉树的层次遍历,我们一层一层地处理,用一个队列(A队列)将每一层的所有节点按照从左到右的顺序入队

    2、待该队列的所有节点都出队,并且用另外一个队列(B队列)接收出队的节点(为下一层节点的处理做准备),则考虑处理下一层节点

    3、将B队列的节点逐个出队,考察节点的左孩子和右孩子,若存在则将孩子节点入A队列,如此循环地处理每一层节点,直到A队列为空结束

    代码(注释中的代码为i的解):

      1 #include <stddef.h>
      2 #include <queue>
      3 #include <vector>
      4 #include <deque>
      5 #include <iostream>
      6 
      7 using namespace std;
      8 
      9 struct TreeNode
     10 {
     11     int val;
     12     TreeNode *left;
     13     TreeNode *right;
     14     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     15 };
     16 
     17 class Solution
     18 {
     19 public:
     20     vector<vector<int> > levelOrder(TreeNode *root)
     21     {
     22         /*
     23         vector<vector<int> > total_result;
     24         vector<int> level_result;
     25         queue<TreeNode *> current_level;
     26         queue<TreeNode *> current_level_bak;
     27 
     28         if (root == NULL)
     29         {
     30             return total_result;
     31         }
     32 
     33         current_level.push(root);
     34 
     35         while (!current_level.empty())
     36         {
     37             TreeNode *current_node = current_level.front();
     38             current_level.pop();
     39             current_level_bak.push(current_node);
     40             level_result.push_back(current_node->val);
     41 
     42             if (current_level.empty())
     43             {
     44                 total_result.push_back(level_result);
     45                 level_result.clear();
     46                 while (!current_level_bak.empty())
     47                 {
     48                     current_node = current_level_bak.front();
     49                     current_level_bak.pop();
     50                     if (current_node->left != NULL)
     51                     {
     52                         current_level.push(current_node->left);
     53                     }
     54                     if (current_node->right != NULL)
     55                     {
     56                         current_level.push(current_node->right);
     57                     }
     58                 }
     59             }
     60         }
     61 
     62         return total_result;
     63         */
     64 
     65         vector<vector<int> > total_result;
     66         deque<vector<int> > temp_result;
     67         vector<int> level_result;
     68         queue<TreeNode *> current_level;
     69         queue<TreeNode *> current_level_bak;
     70 
     71         if (root == NULL)
     72         {
     73             return total_result;
     74         }
     75 
     76         current_level.push(root);
     77 
     78         while (!current_level.empty())
     79         {
     80             TreeNode *current_node = current_level.front();
     81             current_level.pop();
     82             current_level_bak.push(current_node);
     83             level_result.push_back(current_node->val);
     84 
     85             if (current_level.empty())
     86             {
     87                 temp_result.push_front(level_result);
     88                 level_result.clear();
     89                 while (!current_level_bak.empty())
     90                 {
     91                     current_node = current_level_bak.front();
     92                     current_level_bak.pop();
     93                     if (current_node->left != NULL)
     94                     {
     95                         current_level.push(current_node->left);
     96                     }
     97                     if (current_node->right != NULL)
     98                     {
     99                         current_level.push(current_node->right);
    100                     }
    101                 }
    102             }
    103         }
    104 
    105         while (!temp_result.empty())
    106         {
    107             total_result.push_back(temp_result.front());
    108             temp_result.pop_front();
    109         }
    110 
    111         return total_result;
    112     }
    113 };
    114 
    115 int main()
    116 {
    117     TreeNode *root = new TreeNode(3);
    118     root->left = new TreeNode(9);
    119     root->right = new TreeNode(20);
    120     root->right->left = new TreeNode(15);
    121     root->right->right = new TreeNode(7);
    122 
    123     Solution s;
    124     vector<vector<int> > result = s.levelOrder(root);
    125 
    126     for (int i = 0; i < result.size(); ++i)
    127     {
    128         vector<int> level = result[i];
    129         for (int j = 0; j < level.size(); ++j)
    130         {
    131             cout << level[j] << ",";
    132         }
    133         cout << endl;
    134     }
    135 
    136     system("pause");
    137 
    138     return 0;
    139 }
    View Code

    网上的思路也大致是这样

  • 相关阅读:
    [转载]项目风险管理七种武器之引言
    [转载]基于TFS实践敏捷-Scrum模式运用
    [转载]基于TFS实践敏捷-工作项跟踪
    [转载]TFS入门指南
    SVN — subclipse操作指引
    Java 中 方法名或类名 变更 同时 更新 所有引用的 类名或方法名 的解决方案
    Java import javax.servlet 出错
    java 中 SVN 设置所有文件及子目录 needs-lock, svn 提交时自动设置 needs-lock, 及版本不一致问题
    vmware 传输(vmdb)错误-32:pipe:read failed 解决方法
    Web.xml配置详解
  • 原文地址:https://www.cnblogs.com/laihaiteng/p/3797748.html
Copyright © 2011-2022 走看看