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]
]
1. 递归解法
代码如下:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int> > result;
traversal(root, 1, result);
return result;
}
void traversal(TreeNode *p, int level, vector<vector<int> >& result) {
if(!p) return;
if(level > result.size()) {
result.push_back(vector<int>({}));
}
result[level-1].push_back(p->val);
traversal(p->left, level+1, result);
traversal(p->right, level+1, result);
}
};
2. 迭代解法
2.1 解法1
cur: 保存当前层次的结点队列
next: 保存下一层次的结点队列
代码如下:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int> > result;
if(!root) return result;
queue<TreeNode*> cur, next;
cur.push(root);
while(!cur.empty()) {
vector<int> vec;
TreeNode *p;
while(!cur.empty()) {
p = cur.front();
cur.pop();
vec.push_back(p->val);
if(p->left) next.push(p->left);
if(p->right) next.push(p->right);
}
while(!next.empty()) {
p = next.front();
next.pop();
cur.push(p);
}
result.push_back(vec);
}
return result;
}
};
2.2 解法2
代码思路:根据每个层次结点的个数,一次取出当前层次的结点。
代码如下:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int> > res;
if (!root) return res;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
vector<int> oneLevel;
for (int i = q.size(); i > 0; --i) {
TreeNode *t = q.front(); q.pop();
oneLevel.push_back(t->val);
if (t->left) q.push(t->left);
if (t->right) q.push(t->right);
}
res.push_back(oneLevel);
}
return res;
}
};
3.另一种层次遍历(自底而上)
在自上而下的代码基础上增加一行代码即可
例如:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int> > result;
traversal(root, 1, result);
reverse(result.begin(), result.end()); // 增加此行代码
return result;
}
void traversal(TreeNode *p, int level, vector<vector<int> >& result) {
if(!p) return;
if(level > result.size()) {
result.push_back(vector<int>({}));
}
result[level-1].push_back(p->val);
traversal(p->left, level+1, result);
traversal(p->right, level+1, result);
}
};
或者利用栈来保存结果,最后压入到vector<vector<int> >中
代码如下:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution
{
public:
vector<vector<int>> levelOrderBottom(TreeNode* root)
{
vector<vector<int>> res;
queue<TreeNode *> Q;
if(root) Q.push(root);
stack<vector<int>> stk;
while( !Q.empty())
{
int count=0;
int levCount=Q.size();
vector<int> levNode;
while(count<levCount)
{
TreeNode *curNode=Q.front();
Q.pop();
levNode.push_back(curNode->val);
if(curNode->left)
Q.push(curNode->left);
if(curNode->right)
Q.push(curNode->right);
count++;
}
stk.push(levNode); //压入栈
}
while(!stk.empty()) //出栈
{
res.push_back(stk.top());
stk.pop();
}
return res;
}
};
参考资料