zoukankan      html  css  js  c++  java
  • [LeetCode] Binary Tree Level Order Traversal

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

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

        3
       / 
      9  20
        /  
       15   7
    

    return its level order traversal as:

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

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

     

     

     

    1 BFS迭代,借用之前min depth和maxdepth of bianry tree 的框架

     1 struct newNode{
     2     TreeNode * node;
     3     int         dep; // current depth
     4 };
     5 
     6 class Solution {
     7     public:
     8         vector< vector<int> > levelOrder(TreeNode *root) {
     9             vector<vector<int> > result;
    10             if(root == NULL) return result;
    11 
    12             vector<int> levelRes;
    13             queue<newNode*> que;
    14             int curDep ;
    15 
    16             newNode *p = new newNode;
    17             p->node = root;
    18             curDep =  p->dep = 1;
    19             que.push(p);
    20 
    21             while( !que.empty())
    22             {
    23                 p= que.front();
    24                 que.pop();
    25 
    26                 TreeNode *pNode = p->node;
    27                 int dep = p->dep;
    28 
    29                 if(curDep == dep)
    30                 {
    31                     levelRes.push_back(pNode->val);
    32                 }
    33                 else
    34                 {
    35                     result.push_back(levelRes);
    36                     levelRes.clear();
    37                     levelRes.push_back(pNode->val);
    38                     curDep++;
    39                 }
    40 
    41                 if(pNode->left != NULL)
    42                 {
    43                     newNode *tmp = new newNode;
    44                     tmp->node = pNode->left;
    45                     tmp->dep = dep + 1;
    46                     que.push(tmp);
    47                 }
    48 
    49                 if(pNode->right != NULL)
    50                 {
    51                     newNode *tmp = new newNode;
    52                     tmp->node = pNode->right;
    53                     tmp->dep = dep + 1;
    54                     que.push(tmp);
    55                 }
    56 
    57             }
    58 
    59             // add the last level
    60             result.push_back(levelRes);
    61 
    62             return  result;
    63         }
    64 
    65 };

    2 DFS 也可以解决,就是在DFS中每次要传入一个dep,然后根据dep将数据加入到对应的vector中。

     DFS 递归(使用前序遍历框架)

     1 class Solution {
     2     private:
     3         vector<vector<int> > m_result;
     4     public:
     5         void solve(int dep, TreeNode *root)
     6         {   
     7             if (root == NULL)
     8                 return;
     9 
    10             if (m_result.size() > dep)
    11             {   
    12                 m_result[dep].push_back(root->val);
    13             }   
    14             else
    15             {   
    16                 vector<int> tmp;
    17                 tmp.push_back(root->val);
    18                 m_result.push_back(tmp);
    19             }   
    20 
    21             solve(dep + 1, root->left);
    22             solve(dep + 1, root->right);
    23         }   
    24 
    25         vector<vector<int> > levelOrder(TreeNode *root) {
    26             // Start typing your C/C++ solution below
    27             // DO NOT write int main() function
    28             m_result.clear();
    29             solve(0, root);
    30 
    31             return m_result;
    32         }   
    33 };

    DFS 迭代

     1 struct newNode{
     2     TreeNode * node;
     3     int         dep; // current depth
     4 };
     5 
     6 class Solution {
     7     private:
     8     //vector<vector<int> > retsult;
     9     public:
    10         vector< vector<int> > levelOrder(TreeNode *root) {
    11 
    12             vector<vector<int> > result;
    13             if(root == NULL) return result;
    14 
    15             vector<int> levelRes;
    16             stack<newNode*> s;
    17 
    18             newNode *p = new newNode;
    19             p->node = root;
    20             p->dep = 0;
    21             s.push(p);
    22 
    23             while (!s.empty()) {
    24                 p = s.top();
    25                 s.pop();
    26 
    27                 TreeNode *pNode = p->node;
    28                 int dep = p->dep;
    29 
    30                 if( dep + 1 > result.size() ) // new a vector
    31                 {
    32                     vector<int> tmp;
    33                     tmp.push_back(pNode->val);
    34                     result.push_back(tmp);
    35                 }
    36                 else // vector exists
    37                 {
    38                     result[dep].push_back(pNode->val);
    39                 }
    40           //注意先压入右子树,再压入左子树,弹出的时候先弹出左子树,在弹出右子树,实现前序遍历,Root->left->right
    41                 if(pNode->right != NULL)
    42                 {
    43                     newNode *tmp = new newNode;
    44                     tmp->node = pNode->right;
    45                     tmp->dep = dep + 1;
    46                     s.push(tmp);
    47                 }
    48 
    49                 if(pNode->left != NULL)
    50                 {
    51                     newNode *tmp = new newNode;
    52                     tmp->node = pNode->left;
    53                     tmp->dep = dep + 1;
    54                     s.push(tmp);
    55                 }
    56             }
    57             return result;
    58         }
    59 };

     3 双queue法

    class Solution {
        public:
            vector<vector<int> > levelOrder(TreeNode *root)
            {
                queue<TreeNode*> q1;
                queue<TreeNode*> q2;
                vector<vector<int> > res;
    
                if(root != NULL)
                {
                    q1.push(root);
                    res.push_back(vector<int> ());
                }
    
                int depth = 0;
                
    
                while(!q1.empty())
                {
                    TreeNode * p = q1.front();
                    q1.pop();
    
                    res[depth].push_back(p->val);
    
                    if(p->left)
                        q2.push(p->left);
                    if(p->right)
                        q2.push(p->right);
                    if(q1.empty() && !q2.empty())
                    {
                        swap(q1, q2);
                        depth ++;
                        res.push_back(vector<int> ());
                    }
                }   
                return res;
            }   
    };
  • 相关阅读:
    R语言 实验三 数据探索和预处理
    Java学习——包及可见性
    Java学习——包及可见性
    Java学习——使用Static修饰符
    Java学习——使用Static修饰符
    CSDN也有我的博客啦
    将博客搬至CSDN
    Java学习——方法中传递参数分简单类型与复杂类型(引用类型)编程计算100+98+96+。。。+4+2+1的值,用递归方法实现
    Java学习——方法中传递参数分简单类型与复杂类型(引用类型)编程计算100+98+96+。。。+4+2+1的值,用递归方法实现...
    Java学习——方法中传递参数分简单类型与复杂类型(引用类型)
  • 原文地址:https://www.cnblogs.com/diegodu/p/3782396.html
Copyright © 2011-2022 走看看