从上往下打印二叉树(用队列维护分层从左到右打印)

思路:

二叉树的层次遍历就是按照从上到下每行,然后每行中从左到右依次遍历,得到的二叉树的元素值。对于层次遍历,我们通常会使用队列来辅助:

因为队列是一种先进先出的数据结构,我们依照它的性质,如果从左到右访问完一行节点,并在访问的时候依次把它们的子节点加入队列,那么它们的子节点也是从左到右的次序,且排在本行节点的后面,因此队列中出现的顺序正好也是从左到右,正好符合层次遍历的特点。

具体做法:

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;
    }
};