1-Desciption
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
二叉树结点定义如下://Definition for binary tree struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };
2-Solution
这里考虑利用辅助队列来保存二叉树的结点值,下面就下图的二叉树进行分析,首先我们打印根结点1
,这时发现根结点下的左右子结点均有值,所以按照左右子结点的顺序入队列,这样队列里的元素就有2,3
接下来接着进行打印,我们从队列的头取出元素进行打印,即打印结点值’2’,这时发现2
的左右子树非空,所以按照左右子结点的顺序入队列,这样队列里的元素就有3,4,5
以此类推即可以从下往上从左至右将整个二叉树遍历一遍。
下图展示了这一算法分析过程:
根据以上算法分析步骤,可以完成下面的代码:
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> result;
if(root==NULL) return result;//如果树为空,直接返回
queue<TreeNode*> mqueue;//定义一个辅助的队列
mqueue.push(root);
while(!mqueue.empty()){
result.push_back(mqueue.front()->val);//存队列头
if(mqueue.front()->left != NULL){//左子树有值,先入队列
mqueue.push(mqueue.front()->left);
}
if(mqueue.front()->right != NULL){//右子树有值,后入队列
mqueue.push(mqueue.front()->right);
}
mqueue.pop();//依次弹出队列第一个元素
}
return result;
}
};
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191019101352968.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B5dXhpbmc=,size_16,color_FFFFFF,t_70)