给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
我的思路:
其实层序遍历用队列迭代是最好的,符合队列先进先出的理念,而且是一层一层的。
代码1(迭代法):
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> q;
vector<vector<int>> v;//需要返回的结果
q.push(root);
if (root == NULL)
{
return v;
}
while (!q.empty())
{
int len = q.size();//当前层数的长度
vector<int> v1;//存储当前层的值
for (int i = 0; i < len; ++i)//遍历当前层的每一个节点
{
TreeNode* temp = q.front();
q.pop();
v1.push_back(temp->val);
if (temp->left != NULL)
{
q.push(temp->left);
}
if (temp->right != NULL)
{
q.push(temp->right);
}
}
v.push_back(v1);//把当前层的结果放入总的结果集中
}
return v;
}
};
我的思路:
其实递归法与上面的方法类似,只不过是递归模拟了上面的队列,程序需要知道自己在第几层,然后放入对应的节点即可。
拓展
其实二叉树的前中后的迭代遍历类似,也是用栈模拟递归完成迭代遍历。
代码2(递归法):
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;//结果集
helper(root, 0, res);//从当前节点开始,第0层,传入结果集
return res;
}
void helper(TreeNode* root, int level, vector<vector<int>> &res)//level为层数
{
if (root == NULL)
{
return;
}
if (res.size() == level)//说明来到了下一层,需要增加一层的vector<int>
{
res.push_back(vector<int>());
}
res[level].push_back(root->val);//把当前节点值存入当前level对应的vector<int>里
helper(root->left, level + 1, res);
helper(root->right, level + 1, res);
}
};