PrintTree

题目描述[原题链接][https://www.acwing.com/problem/content/description/43/]

请实现一个函数按照之字形顺序从上向下打印二叉树。

即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

样例

1
2
3
4
5
6
7
输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]
8
/ \
12 2
/ \
6 4
输出:[[8], [2, 12], [6, 4]]

算法分析

利用vector来存结果,每次删除定长的元素,写一个将节点链表转换成整形列表,处理完将结果保存,设置一个标志位,每次取反,当标志位为true反转,最后将结果。

C++代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
* 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> getVal(vector<TreeNode*> nodes){
vector<int> ans;
for(auto &node:nodes){
ans.push_back(node->val);
}
return ans;
}

vector<vector<int>> printFromTopToBottom(TreeNode* root) {
vector<vector<int>> ans;
if(!root)return ans;
vector<TreeNode*> level;
level.push_back(root);
ans.push_back(getVal(level));
bool falg=true;
while(true){
vector<TreeNode*> newlevel;
for(auto &u:level){
if(u->left)newlevel.push_back(u->left);
if(u->right)newlevel.push_back(u->right);
}
vector<int> t = getVal(newlevel);
if(newlevel.size()){
if(falg){
reverse(t.begin(),t.end());
}
ans.push_back(t);
falg=!falg;
}else break;
level=newlevel;
}
return ans;
}
};

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> getValue(List<TreeNode> node){
List<Integer> list = new ArrayList<>();
for(int i=0;i<node.size();i++){
list.add(node.get(i).val);
}
return list;
}

public List<List<Integer>> printFromTopToBottom(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
if(root==null)return ans;
List<TreeNode> res = new ArrayList<>();
res.add(root);
ans.add(getValue(res));
boolean flag = false;
while(true){
int t = res.size();
for(int i=0;i<t;i++){
TreeNode node = res.get(0);
res.remove(node);
if(node.left!=null)res.add(node.left);
if(node.right!=null)res.add(node.right);
}
if(res.size()==0)break;
List<Integer> l = getValue(res);
flag = !flag;
if(flag){
List<Integer> tt = new ArrayList<>();
for(int i=l.size()-1;i>=0;i--)tt.add(l.get(i));
l=tt;
}
ans.add(l);
}
return ans;
}
}