Code & Func
2017-10-24

第31天。

今天的题目是之前好像就做过的了,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,null,null,15,7],

1
3
2
/ \
3
9 20
4
/ \
5
15 7

return its level order traversal as:

1
[
2
[3],
3
[9,20],
4
[15,7]
5
]

emmm,简单来讲就是层次遍历.

一般来说,层次遍历都是用队列来实现:

  • 先让root入队,这时我们队列里面就有第一层的所有元素了
  • 我们记录当前层次所拥有的元素的个数size,然后出队size个元素,对于每一个出队的元素,我们遍历它一次,然后将它的左右孩子入队。
1
vector<vector<int>> levelOrder(TreeNode* root) {
2
vector<vector<int> > ret;
3
if (root == NULL) return ret;
4
queue<TreeNode *> q;
5
q.push(root);
6
int size = 0;
7
int last = 0;
8
while((size = q.size())) {
9
ret.push_back(vector<int>());
10
while(size--) {
11
root = q.front();
12
q.pop();
13
ret[last].push_back(root->val);
14
if (root->left) q.push(root->left);
15
if (root->right) q.push(root->right);
5 collapsed lines
16
}
17
last++;
18
}
19
return ret;
20
}

然后因为这里是返回vector< vector<int> >,而不是直接输出,所以我们可以取个巧,写出一个递归算法出来:

1
vector<vector<int> > ret;
2
vector<vector<int>> levelOrder(TreeNode* root) {
3
leverlOrder(root,0);
4
return ret;
5
}
6
void levelOrder(TreeNode* root,int level) {
7
if (root==NULL)
8
return;
9
if (level >= ret.size() ) {
10
ret.push_back(vector<int>());
11
}
12
ret[level].push_back(root->val);
13
levelOrder(root->left,level+1);
14
levelOrder(root->right,level+1);
15
}

这里其实是先序遍历,但是因为我们一直记录着层数,所以我们还是可以保证vector<vector<int> >的顺序是正确的。

上一条动态