从上往下打印二叉树(用队列维护分层从左到右打印)
思路:
二叉树的层次遍历就是按照从上到下每行,然后每行中从左到右依次遍历,得到的二叉树的元素值。对于层次遍历,我们通常会使用队列来辅助:
因为队列是一种先进先出的数据结构,我们依照它的性质,如果从左到右访问完一行节点,并在访问的时候依次把它们的子节点加入队列,那么它们的子节点也是从左到右的次序,且排在本行节点的后面,因此队列中出现的顺序正好也是从左到右,正好符合层次遍历的特点。
具体做法:
step 1:首先判断二叉树是否为空,空树没有遍历结果。
step 2:建立辅助队列,根节点首先进入队列。不管层次怎么访问,根节点一定是第一个,那它肯定排在队伍的最前面。
step 3:每次遍历队首节点,如果它们有子节点,依次加入队列排队等待访问。
图解:
链接
代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
//定义一个容器用来存遍历树的节点的编号
vector<int>res;
//先判断一下如果树为空,就直接返回res
if(root==NULL){
return res;
}
//对于二叉树的节点从上往下,每层从左到右打印,可以用一个队列进行维护,因为队列是先进先出的结构,将每层的节点从左到右遍历存入队列中,再从左到右将该层的每个节点依次扩展出其子节点存入队列中,将扩展完的点弹出队列
queue<TreeNode*>q;
//先将根节点入队列
q.push(root);
TreeNode* cur;
//只要队列还不为空,即还有点没有扩展完
while(!q.empty()){
cur=q.front();
//如果存在左节点,就将左节点的插入队列中
if(cur->left!=NULL){
q.push(cur->left);
}
//如果存在右节点,就将右节点插入队列中
if(cur->right!=NULL){
q.push(cur->right);
}
//将扩展完的点弹出队列,并插入数组容器中
res.push_back(cur->val);
q.pop();
}
return res;
}
};