[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;
        }   
};
原文地址:https://www.cnblogs.com/diegodu/p/3782396.html