• [LeetCode] Binary Tree Level Order Traversal II


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

    For example:
    Given binary tree {3,9,20,#,#,15,7},

        3
       / 
      9  20
        /  
       15   7
    

    return its bottom-up level order traversal as:

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

    confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

    Hide Tags
     Tree Breadth-first Search

        这题其实就是一个二叉树的广度搜索,然后就是reverse。
        写了两个,一个整个树用vector 记录,然后行之间用NULL 标记,然后再填回去,不过这样很耗空间,本来这样写是为了不想使用reverse,后面发现还是使用比较好。
     1 class Solution {
     2 public:
     3     vector<vector<int> > levelOrderBottom(TreeNode *root) {
     4         vector<vector<int> >ret;
     5         if(root==NULL)  return ret;
     6         vector<int> line;
     7         vector<TreeNode *> que;
     8         TreeNode * curNode;
     9         int idx= 0;
    10         que.push_back(root);
    11         que.push_back(NULL);
    12         while(idx+1<que.size()){
    13             curNode=que[idx];
    14             if(curNode!=NULL){
    15                 if(curNode->left!=NULL) que.push_back(curNode->left);
    16                 if(curNode->right!=NULL)    que.push_back(curNode->right);
    17             }
    18             else{
    19                 if(idx+1<que.size())
    20                     que.push_back(NULL);
    21             }
    22             idx++;
    23         }
    24         for(idx--,line.clear();idx>=0;idx--){
    25             curNode = que[idx];
    26             if(curNode==NULL){
    27                 reverse(line.begin(),line.end());
    28                 ret.push_back(line);
    29                 line.clear();
    30             }
    31             else{
    32                 line.push_back(curNode->val);
    33             }
    34         }
    35         ret.push_back(line);
    36         return ret;
    37     }
    38 };
    View Code

         另外一个就是,标准的queue 广度搜索,queque 中存一行的全部node ,然后利用当前行的node 数,边写var 边填入queque ,不过不是外部循环,利用node 处理方便很多,下面代码就是用了外部循环,没有那么简洁:

      1 #include <iostream>
      2 #include <vector>
      3 #include <queue>
      4 #include <algorithm>
      5 #include <iterator>
      6 using namespace std;
      7 
      8 
      9 ///Definition for binary tree
     10 struct TreeNode {
     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 public:
     19     vector<vector<int> > levelOrderBottom(TreeNode *root) {
     20         vector<vector<int> >ret;
     21         if(root==NULL)  return ret;
     22         vector<int> line;
     23         vector<TreeNode *> que;
     24         TreeNode * curNode;
     25         int idx= 0;
     26         que.push_back(root);
     27         que.push_back(NULL);
     28         while(idx+1<que.size()){
     29             curNode=que[idx];
     30             if(curNode!=NULL){
     31                 if(curNode->left!=NULL) que.push_back(curNode->left);
     32                 if(curNode->right!=NULL)    que.push_back(curNode->right);
     33             }
     34             else{
     35                 if(idx+1<que.size())
     36                     que.push_back(NULL);
     37             }
     38             idx++;
     39         }
     40         for(idx--,line.clear();idx>=0;idx--){
     41             curNode = que[idx];
     42             if(curNode==NULL){
     43                 reverse(line.begin(),line.end());
     44                 ret.push_back(line);
     45                 line.clear();
     46             }
     47             else{
     48                 line.push_back(curNode->val);
     49             }
     50         }
     51         ret.push_back(line);
     52         return ret;
     53     }
     54 };
     55 */
     56 class Solution {
     57 public:
     58     vector<vector<int> > levelOrderBottom(TreeNode *root) {
     59         vector<vector<int> >ret;
     60         if(root==NULL)  return ret;
     61         vector<int> line;
     62         queue<TreeNode *> que;
     63         TreeNode * curNode;
     64         que.push(root);
     65         que.push(NULL);
     66         while(que.size()>1){
     67             curNode=que.front();
     68             que.pop();
     69             if(curNode==NULL){
     70                 ret.push_back(line);
     71                 line.clear();
     72                 que.push(NULL);
     73                 continue;
     74             }
     75             line.push_back(curNode->val);
     76             if(curNode->left!=NULL) que.push(curNode->left);
     77             if(curNode->right!=NULL)    que.push(curNode->right);
     78 
     79         }
     80         ret.push_back(line);
     81         reverse(ret.begin(),ret.end());
     82         return ret;
     83     }
     84 };
     85 
     86 
     87 
     88 
     89 int main()
     90 {
     91     Solution sol;
     92     TreeNode node1(1);
     93     TreeNode node2(2);
     94     TreeNode node3(3);
     95     TreeNode node4(4);
     96     node1.right=&node2;
     97     node2.left =&node3;
     98     node2.right =&node4;
     99 
    100     vector<vector<int> >ret =sol.levelOrderBottom(&node1);
    101     for(int i=0;i<ret.size();i++){
    102         copy(ret[i].begin(),ret[i].end(),ostream_iterator<int>(cout," "));
    103         cout<<endl;
    104     }
    105 
    106 
    107     return 0;
    108 }
    View Code
     
         discuss 中有另外一个历史dfs 实现的,思路其实差不多,dfs 中每次遍历的值先填写到vector<vector<int> >  ret正确位置,即一列一列地填,而bfs 则是一行一行地填ret,最后反向一下,仍然是不能避免反向。
    下面是代码,直接copy一下了:
    https://oj.leetcode.com/discuss/5353/there-better-regular-level-order-traversal-reverse-result
     
     1 vector<vector<int> > res;
     2 
     3 void DFS(TreeNode* root, int level)
     4 {
     5     if (root == NULL) return;
     6     if (level == res.size()) // The level does not exist in output
     7     {
     8         res.push_back(vector<int>()); // Create a new level
     9     }
    10 
    11     res[level].push_back(root->val); // Add the current value to its level
    12     DFS(root->left, level+1); // Go to the next level
    13     DFS(root->right,level+1);
    14 }
    15 
    16 vector<vector<int> > levelOrderBottom(TreeNode *root) {
    17     DFS(root, 0);
    18     return vector<vector<int> > (res.rbegin(), res.rend());
    19 }
    View Code
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    PHP如何学习?
    PHP compact() 函数
    Laravel中resource方法
    npm run watch-poll 监控css、js 文件更新
    MYSQL 的optimize怎么用
    出现“Windows资源管理器已停止工作”错误
    移动硬盘文件或目录损坏且无法读取怎么解决
    Linux下iptables 禁止端口和开放端口
    Linux VSFTP服务器详细配置
    分享一个基于ligerui的系统应用案例ligerRM V2(权限管理系统)(提供下载)
  • 原文地址:https://www.cnblogs.com/Azhu/p/4132676.html
Copyright © 2020-2023  润新知