题目:从上往下打印出二叉树的每个结点,同层结点从左至右依次打印。
/*
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> value;
if(root == NULL)
return value;
queue<TreeNode* > q;
q.push(root);
while(!q.empty()){
TreeNode* pNode = q.front();
value.push_back(pNode->val);
q.pop();
if(pNode->left)
q.push(pNode->left);
if(pNode->right)
q.push(pNode->right);
}
return value;
}
};
/*思路:
这实际上是一种遍历二叉树的方法。
一开始不清楚怎么做的时候,可以先用一个二叉树例子来实验一下:我们设二叉树为
1,2,3,4,5,6,7。1为根节点,2,3为1的左右子树,4,5为2的左右子树,6,7为3的左右
子树。
首先应该打印出根节点,可以先取出1放入一个容器中,然后打印;再判断1是否有左右
子树,有的话将左右子树依次放入容器中,现在容器中有2和3两个结点;取出2,打印,
判断2是否有左右子树,有的话放入容器,现在容器中有3,4,5三个结点;取出3,依次下
去,直到打印完,容器为空,停止。这个容器是先进先出的,我们可以用队列来实现。
*/
/*首先判断二叉树是否为空,空的话返回一个空的值(对应于题中的就是返回空vector)
二叉树不为空时,我们首先应该打印出根节点,如果根节点下还有子结点,那么依次打
印左子树和右子树。
我们可以借助队列:队列是先进先出的。首先根节点入队,然后取出根节点暂存,将根
节点的值压入vector value,并将根节点pop出去,接下来判断其是否存在左右子树,存
在的话依次压入队列;现在队列中存在根节点下的左右子树了,先取出左子树结点暂存,
将左子树的值压入vector value,并将左子树pop出去,然后判断左子树是否存在左右子
树,存在的话入队;现在队列中存在根节点下的右子树以及根节点的左子树的左右子树了;
重复,直至到达最后一层结点。最后返回value。
*/