二叉树的层次遍历
题目描述:
给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)。
样例
给一棵二叉树 {3,9,20,#,#,15,7} :
3
/ \
9 20
/ \
15 7
返回他的分层遍历结果:
[
[3],
[9,20],
[15,7]
]
解题思路:
利用队列的特性,将根结点放入事先建好的队列中,若队列的长度不为0,则在队列中删除根结点,同时把根结点插入向量中以及把它的左右儿子放进队列中,以此类推,这样便能达到层次遍历的要求。
代码实现:
class Solution {
/**
* @param root: The root of binary tree.
* @return: Level order a list of lists of integer
*/
public:
vector<vector<int>> levelOrder(TreeNode *root) {
// write your code here
vector<vector<int>>lever;
if(root==NULL) return lever;
vector<int>dlever;
queue<TreeNode*>q;
q.push(root);
int i=1;
int j=0;
while(!q.empty()){
TreeNode *p=q.front();
q.pop();
if(p==NULL) {
++j;
}
else {
dlever.push_back(p->val);
q.push(p->left);
q.push(p->right);
}
if(i==(dlever.size()+j)&&dlever.size()!=0){
lever.push_back(dlever);
dlever.clear();
i=i*2;
j=j*2;
}
}
return lever;
}
};
/**
* @param root: The root of binary tree.
* @return: Level order a list of lists of integer
*/
public:
vector<vector<int>> levelOrder(TreeNode *root) {
// write your code here
vector<vector<int>>lever;
if(root==NULL) return lever;
vector<int>dlever;
queue<TreeNode*>q;
q.push(root);
int i=1;
int j=0;
while(!q.empty()){
TreeNode *p=q.front();
q.pop();
if(p==NULL) {
++j;
}
else {
dlever.push_back(p->val);
q.push(p->left);
q.push(p->right);
}
if(i==(dlever.size()+j)&&dlever.size()!=0){
lever.push_back(dlever);
dlever.clear();
i=i*2;
j=j*2;
}
}
return lever;
}
};
A题感悟:
我觉得这道题有些难,虽然思路好理解,但是代码实现总是不行,所有就借鉴了一下别人的代码。在此代码中学会了队列还有双重向量的一些用法,也算收获不少。