[32]从上到下打印二叉树
文章目录
1.不分行从上到下打印二叉树
1.1题目
从上到下打印出二叉树的每一个节点,同一层的节点按照从左到右的顺序打印
上图中的二叉树,则依次打印出 [8,6,10,5,7,9,11]
1.2思路
BFS(广度优先搜索)
- 先扩展根节点
- 再依次扩展根节点的左右儿子,也就是从左到右扩展第二层节点
- 再依次从左到右扩展第三层节点
- 依次类推
1.3代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> printFromTopToBottom(TreeNode* root) {
vector<int> res;
if(!root) return res;
queue<TreeNode*> q;
q.push(root);
while(q.size()) // 当队列不为空时
{
auto x = q.front();
q.pop();
res.push_back(x->val);
if(x->left) q.push(x->left);
if(x->right) q.push(x->right);
}
return res;
}
};
2.分行从上到下打印二叉树
2.1 题目
从上到下按照层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行
二叉树的结果为;
8
6 10
5 7 9 11
2.2思路
用 null
表示一行的结尾
在每一层结束的时候,往
queue
里塞一个null
做为标记在
queue
读取一个数出来后,看看是不是标记符null
,如果是说明这层已经结束。
2.3代码
class Solution {
public:
vector<vector<int>> printFromTopToBottom(TreeNode* root) {
vector<vector<int>> res;
if(!root) return res;
queue<TreeNode*> q;
q.push(root);
q.push(NULL); //root层结束的标识符
vector<int> cur;
while(q.size())
{
TreeNode* t = q.front();
q.pop();
if(t)
{ //跟上一道题同样的操作
cur.push_back(t->val);
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
else
{ //此时为null,表示一层的结束
if(q.size()) q.push(NULL); // 为一层结束加上 NULL
res.push_back(cur);
cur.clear();
}
}
return res;
}
};
3. 之字形打印二叉树
3.1题目
请实现一个函数,按照之字行顺序打印二叉树,即第一行按照从左到右的顺序打印,第二行按照从右到左的顺序打印,第三行按照从左到右的顺序打印。其他行以此类推
二叉树的结果
8
10 6
5 7 9 11
3.2思路
按照题2
奇数行 从左到右
偶数行 从右到左【设置一个 bool 变量】
3.3代码
class Solution {
public:
vector<vector<int>> printFromTopToBottom(TreeNode* root) {
vector<vector<int>> res;
if(!root) return res;
queue<TreeNode*> q;
q.push(root);
q.push(NULL); //root层结束的标识符
vector<int> cur;
bool zigzag = false; // 设置一个 bool 标记
while(q.size())
{
TreeNode* t = q.front();
q.pop();
if(t)
{ //跟上一道题同样的操作
cur.push_back(t->val);
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
else
{ //此时为null,表示一层的结束
if(q.size()) q.push(NULL); // 为一层结束加上 NULL
if(zigzag) reverse(cur.begin(), cur.end());
zigzag = !zigzag;
res.push_back(cur);
cur.clear();
}
}
return res;
}
};