题目链接: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.
OJ‘s Binary Tree Serialization:
The serialization of a binary tree follows a level order traversal, where ‘#‘ signifies a path terminator where no node exists below.
Here‘s an example:
1
/ \
2 3
/
4
\
5
The above binary tree is serialized as "{1,2,3,#,#,4,#,#,5}".
这道题的要求是分层遍历二叉树。
由于需要把每层的节点分别放入到数组中,因此需要引入变量n记录每层的节点数量。剩下的,就是广度优先搜索的方法了。
广度优先搜索算法(Breadth First Search),又叫宽度优先搜索,或横向优先搜索。从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。借助队列数据结构,由于队列是先进先出的顺序,因此可以先将左子树入队,然后再将右子树入队。这样一来,左子树结点就存在队头,可以先被访问到。
时间复杂度:O(n)
空间复杂度:O(n)
1 class Solution {
2 public:
3 vector<vector<int> > levelOrder(TreeNode *root)
4 {
5 vector<vector<int> > vvi;
6
7 if(NULL == root)
8 return vvi;
9
10 queue<TreeNode *> q;
11 q.push(root);
12 while(!q.empty())
13 {
14 vector<int> vi;
15 for(int i = 0, n = q.size(); i < n; ++ i)
16 {
17 TreeNode *temp = q.front();
18 q.pop();
19 if(temp -> left != NULL)
20 q.push(temp -> left);
21 if(temp -> right != NULL)
22 q.push(temp -> right);
23 vi.push_back(temp -> val);
24 }
25 vvi.push_back(vi);
26 }
27
28 return vvi;
29 }
30 };