题目:
给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)
样例
给一棵二叉树 {3,9,20,#,#,15,7}
:
3
/ \
9 20
/ \
15 7
返回他的分层遍历结果:
[
[3],
[9,20],
[15,7]
]
挑战
* Definition of TreeNode:
挑战1:只使用一个队列去实现它
挑战2:用DFS算法来做
思路:
层次遍历用队列的方法
首先将根指针入队,然后从队头取出一个元素并访问该指针所指结点,若该指针所指结点的左右孩子结点非空,则将其做孩子指针和有孩子指针入队,重复上述步骤,知道队列为空。
具体实现代码:
/**
* 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:
vector<vector<int>> levelOrder(TreeNode *root) {
// write your code here
TreeNode *Q[100000];
TreeNode *q;
vector<vector<int>>vv;
int front;
int rear;
int a;
front=rear=-1;
if(root==NULL) return vv;
Q[++rear]=root;
while(front!=rear){
vector<int>v;
while(front<a){
q=Q[++front];
v.push_back(q->val);
if(q->left!=NULL) Q[++rear]=q->left;
if(q->right!=NULL) Q[++rear]=q->right;}
a=rear;
vv.push_back(v);
}
return vv;
}
};
感悟:
层次遍历与前序、中序、后序的遍历方法不同,层次遍历符合队列的操作特性,而其他次序的遍历方法适合堆栈的操作特性