题目描述:
从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入下图中的二叉树,则依次打印出8、6、10、5、7、9、11。
解题思路:
这道题实质是考查树的层次遍历(广度优先遍历)算法:每一次打印一个结点的时候,如果该结点有子结点,则把该结点的子结点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的结点,重复前面的打印操作,直至队列中所有的结点都被打印出来为止。
Demo:
/*
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) {
queue<TreeNode *> que;
que.push(root);
vector<int> vecout;
if (root == nullptr)
return vecout;
// 广度优先搜索
while (!que.empty())
{
// 取队头元素
auto tmp = que.front();
vecout.push_back(tmp->val);
// 把左右子结点加入队列
if (tmp->left != nullptr)
que.push(tmp->left);
if (tmp->right != nullptr)
que.push(tmp->right);
que.pop();
}
return vecout;
}
};