1.问题描述:给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)
2.思路:正如样例
给一棵二叉树 {3,9,20,#,#,15,7}
:
3
/ \
9 20
/ \
15 7
返回他的分层遍历结果:
[
[3],
[9,20],
[15,7]
]
首先定义两个向量,一个用于储存每一层的节点(f),一个用于储存分层遍历的结果(w).再定义一个队列q并且把根节点放在q中,再定义一个指针t指向队列的头节点,此时正好为根节点。并把这个节点放在f中,放入之后再在队列中把它弹出,队列的长度减一。再把左子树右子树分别放入队列中,此时队列的长度为0则跳出循环,把f放入w中,再把f清空。再进入循环中这样t就指向了当初的左子树……这样f中每储存完一层节点就放入w中再清除,最终就可以实现节点值的层次遍历!
3.代码:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
/**
* @param root: The root of binary tree.
* @return: Level order a list of lists of integer
*/
public:
std::vector<int> f;
std::vector<vector <int>> w;
vector<vector<int>> levelOrder(TreeNode *root) {
// write your code here
if(root==NULL) return w;
queue <TreeNode*> q;
q.push(root);
int length;
while(!q.empty())
{
length=q.size();
while(length!=0)
{ TreeNode *t=q.front();
f.push_back(t->val);
q.pop();
length--;
if(t->left!=NULL)
q.push(t->left);
if(t->right!=NULL)
q.push(t->right);
}
w.push_back(f);
f.clear();
}
return w;
}
};
4.感想:二叉树的层次遍历运用了队列的先进先出的原则。但一定要注意队列的弹出还有向量的清空~