problem

​Binary Tree Level Order Traversal II​

根据题意,需要将每层的节点分别放入数组中,因此需要每层节点的数量。

广度优先搜索算法(Breadth First Search),又叫宽度优先搜索,或横向优先搜索。从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。借助队列数据结构,由于队列是先进先出的顺序,因此可以先将左子树入队,然后再将右子树入队。这样一来,左子树结点就存在队头,可以先被访问到。

code

【leetcode】107-Binary Tree Level Order Traversal II_先进先出

【leetcode】107-Binary Tree Level Order Traversal II_子树_02

/**
* 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 {//BFS.
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> vvi;
queue<TreeNode*> q;
if(root==NULL) return vvi;//
q.push(root);
while(!q.empty())
{
vector<int> vi;
for(int i=0, n=q.size(); i<n; i++)//q.size() always be changing.
{
TreeNode* tmp = q.front();
q.pop();
if(tmp->left != NULL) q.push(tmp->left);
if(tmp->right != NULL) q.push(tmp->right);
vi.push_back(tmp->val);
}
vvi.push_back(vi);
}
reverse(vvi.begin(), vvi.end());
return vvi;
}
};

View Code

总结

1. 使用队列的数据结构,记录每层的节点及其数目,队列先进先出,先左后右分别入队列;

2. 头结点的非空判断,以及每层节点的非空判断;

3. 每层节点的数量在处理的过程中会发生变化,需要将每层的节点数目固定赋值给某一变量;

4. 数据结构queue的用法;

参考

1. ​​Binary Tree Level Order Traversal II​​;


3. ​​cplusplus_queue​​;