剑指offer22 _层次遍历:从上往下打印二叉树。
从上往下打印二叉树
http://www.nowcoder.com/questionTerminal/7fe2212963db4790b57431d9ed259701
class Solution { public: vector<int> PrintFromTopToBottom(TreeNode* root) { vector<int>res; if(root==NULL)return res;//根节点为空,则直接返回一个空的vector数组 queue<TreeNode*>que; //定义一个队列利用队列先进先出的特点,达到层次遍历的目的 TreeNode* p=root; que.push(p); //将第一层的节点入队 int level_num=0;//计算二叉树的层数 while(!que.empty()){ //如果队列列表为空,以层次遍历完全 int size=que.size(); //计算当前层次的节点数 for(int i=0;i<size;++i){//并以此将他们存储下来 p=que.front(); //从左到右的顺序依次让这层的节点出队 que.pop(); res.push_back(p->val); if(p->left)que.push(p->left);//如果该节点的下一层有子节点,则将他们入队 if(p->right)que.push(p->right); } level_num++;//层数加一 } return res; } };
利用队列先进先出的特点,达到层次遍历的目的。由于队列的特点,新入队的节点只会排在队列的后面,并不会影响队列中上一层节点的出队。
1.将某一层的全部节点入队。
2.计算该层的节点数size。
3.将队列的前size个节点出队。按造从左到右的顺序依次遍历,遍历的同时判断该节点有无下一层的子树,若有则入队,从而将下一层的全部节点入队。