链接
思路
二叉树层序遍历
广度优先
先在队列中加入根结点。之后对于任意一个结点来说,在其出队列的时候,访问之。同时如果左孩子和右孩子有不为空的,入队列。
cpp
我自己想出来的思路就是,求出每一层的节点,然后根据每一层的节点,更新下一层的节点,再找出节点相对应的值。
真的好麻烦,而且一堆bug,不简洁优雅,不写了。
参考别人的思路,是把二维数组的每个数组,在每一层,分别添加。而不是一起做。所以好像简单一点。
这样知道是哪一层的,然后再往相应层添加元素,真的很方便。
1.递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
level_order(res, 0, root);
return res;
}
void level_order(vector<vector<int>> &res, int level, TreeNode *root){
if(root == NULL){
return ;
}
if (res.size() < level + 1) res.resize(level + 1);
//为结果增加一个数组,因为这里没法用push_back()
res[level].push_back(root->val);
level_order(res, level + 1, root->left);
level_order(res, level + 1, root->right);
}
};
2.
看了别人的思路,不就是前面我想出来的迭代算法吗2333.不过已经删了,看别的人又重写一遍。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root == NULL){
return res;
}
vector<TreeNode *> q;
q.push_back(root);
int level = 0;
while(!q.empty()){
res.push_back(vector<int>());
auto sz = q.size();
for(auto i = 0; i < sz; i++){
auto t = q.front();
q.erase(q.begin());
res[level].push_back(t->val);
if (t->left != NULL) q.push_back(t->left);
if (t->right != NULL) q.push_back(t->right);
}
level++;
}
return res;
}
};
注意这里必须在for之前记下数组的大小,因为在循环过程中会对数组进行删除操作,所以可能数组大小会改变。这里直接从前面删除指定个元素,然后把新元素添加到后面即可。不用再来一个新的tem数组。
这个方法时间空间上效率都很高。