acwing-04
不分行从上往下打印二叉树(简单)
从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。
样例
输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null]
8
/ \
12 2
/
6
/
4
输出:[8, 12, 2, 6, 4]
- 即为二叉树的层次遍历
- 利用队列,将其逐个放入队列,每次从队列中取元素放入结果中
class Solution {
public:
vector<int> printFromTopToBottom(TreeNode* root) {
vector<int> res;
if(root==NULL)return res;
queue<TreeNode *> _queue;
TreeNode *t;
_queue.push(root);
while(!_queue.empty()){
t=_queue.front();_queue.pop();
res.push_back(t->val);
if(t->left!=NULL)_queue.push(t->left);
if(t->right!=NULL)_queue.push(t->right);
}
return res;
}
};
分行从上往下打印二叉树(中等)
从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。
样例
输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null]
8
/ \
12 2
/
6
/
4
输出:[[8], [12, 2], [6], [4]]
- 采用dfs搜索得到二叉树的层数
- 构造结构体,记录结点的层数
- 根据层次遍历的思想,将结点值依次按照层数放入二维数组中
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
typedef struct Edge
{
TreeNode *node;
int pos;
}Edge;
class Solution {
public:
int dfs(TreeNode *root,int deep){
if(root==NULL)return deep;
else return max(dfs(root->left,deep+1),dfs(root->right,deep+1));
}
vector<vector<int>> printFromTopToBottom(TreeNode* root) {
vector<vector<int>> res;
if(root==NULL)return res;
int n=dfs(root,0);
for(int i=0;i<n;i++){vector<int> p;res.push_back(p);}
queue<Edge *> _queue;Edge *ans,*t;
t=(Edge *)malloc(sizeof(Edge));
t->node=root;t->pos=0;
_queue.push(t);
while(!_queue.empty()){
ans=_queue.front();_queue.pop();
res[ans->pos].push_back(ans->node->val);
if(ans->node->left!=NULL){
t=(Edge *)malloc(sizeof(Edge));
t->node=ans->node->left;
t->pos=(ans->pos+1);
_queue.push(t);
}
if(ans->node->right!=NULL){
t=(Edge *)malloc(sizeof(Edge));
t->node=ans->node->right;
t->pos=(ans->pos+1);
_queue.push(t);
}
}
return res;
}
};
之字形打印二叉树(中等)
请实现一个函数按照之字形顺序从上向下打印二叉树。
即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
样例
输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]
8
/ \
12 2
/ \
6 4
输出:[[8], [2, 12], [6, 4]]
- 采用两个数组,交替按顺序存放两层结点的数
- 根据层数的变化,不断按从左到右的顺序或者是从右到左的顺序读出结点的值放入二维数组中
/**
* 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:
void AppendRes(vector<vector<int>>&res,vector<TreeNode *> ans,int pos){
vector<int> t;
if(pos==1){
for(int i=0;i<ans.size();i++)
t.push_back(ans[i]->val);
}else{
for(int i=ans.size()-1;i>=0;i--)
t.push_back(ans[i]->val);
}
if(!t.empty())res.push_back(t);
}
vector<vector<int>> printFromTopToBottom(TreeNode* root) {
vector<vector<int>> res;
if(root==NULL)return res;
int f=-1;
vector<TreeNode *> ans1,ans2;
ans1.push_back(root);
AppendRes(res,ans1,f);
while(!ans1.empty()){
for(int i=0;i<ans1.size();i++){
if(ans1[i]->left!=NULL)ans2.push_back(ans1[i]->left);
if(ans1[i]->right!=NULL)ans2.push_back(ans1[i]->right);
}
f=-f;
ans1=ans2;
AppendRes(res,ans1,-f);
ans2.clear();
}
return res;
}
};