题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
第一种是输出格式无要求的代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
#include <queue>
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> res;
queue<TreeNode*> q;
if(root == NULL) return res;
q.push(root);//使用队列存储要打印的层节点
while(!q.empty()){
TreeNode* front = q.front();
res.push_back(front->val);
q.pop();
if(front->left != NULL)
q.push(front->left);
if(front->right != NULL)
q.push(front->right);
}
return res;
}
};
第二种是需要按实际二叉树每层拥有节点的个数进行打印(需要按行打印)
从上往下打印出二叉树的每个节点,同层节点从左至右打印。每层元素输出后要换行。
使用 last 记录当前行的最后一个元素,nlast 记录下一行的最后一个元素(实时更新(指向子孩子))
使用队列维护,一开始 last = root,root 入队,当队列不为空时,执行循环:取队头元素,将其子孩子入队,nlast 更新=>指向子孩子,弹出队头元素时将元素与 last 比较是否相同,相同即当前行已经输出到最后一个元素了(需要换行),此时 nlast 指向下一行的最后一个元素,将 last = nlast 即可更新 last 值,再继续执行上述操作直至队列为空。。
主要代码如下:
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> res;
queue<TreeNode*> q;
if (root == NULL) return res;
TreeNode* last = root, *nlast = NULL;//初始化 last为根节点。
q.push(root);//使用队列存储要打印的层节点。
while (!q.empty()){
TreeNode* front = q.front();
res.push_back(front->val);
q.pop();
if (front->left != NULL){
q.push(front->left);//左子树非空则入队。
nlast = front->left;//更新 nlast。
}
if (front->right != NULL){
q.push(front->right);
nlast = front->right;
}
cout << front->val << " ";
if (front == last){//若当前出队元素等于 last 表示当前行已遍历至尾。
last = nlast;//nlast 此时为下一行的最末节点指针,需要更新 last 指向它。
cout << endl;//换行。
}
}
return ;
}
};