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]
,
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
题目大意:给出一棵二叉树,对其进行层序遍历并分层输出。
解题思路:有递归和非递归两种解法。递归解法是设置一个depth记录当前深度,设置一个二维数组v保存每一层的节点,向下一层遍历时depth加1;当depth等于二维数组的行数时创建一个新的行。非递归解法用到了队列,层序遍历非常简单,难点在于分层输出。我们可以设置cur表示当前层已遍历的节点数量,last为当前层的所有节点数,当cur == last时表示该层遍历结束。
代码如下:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == nullptr) return vector<vector<int>>();
// return levelOrderTraversal(root, v);
_levelOrderTraversal(root, 0, v);
return v;
}
private:
queue<TreeNode*> que;
vector<int> vec;
vector<vector<int>> v;
//非递归版本
void levelOrderTraversal(TreeNode* root, vector<vector<int>>& v) {
int cur = 0, last;
que.push(root);
while(cur < que.size()){
last = que.size();
while(cur < last){
TreeNode* tmp = que.front();
vec.push_back(tmp->val);
que.pop();
if(tmp->left) que.push(tmp->left);
if(tmp->right) que.push(tmp->right);
cur++;
}
//cur == last该层遍历结束
cur = 0;
v.push_back(vec);
vec.clear();
}
return ;
}
//递归版本
void _levelOrderTraversal(TreeNode* node, int depth, vector<vector<int>>& v) {
if (node == nullptr) return;
if (depth == v.size()) v.push_back(vector<int>());
v[depth].push_back(node->val);
_levelOrderTraversal(node->left, depth + 1, v);
_levelOrderTraversal(node->right, depth + 1, v);
}
};