TraversalTree

题目描述[原题链接][https://www.acwing.com/problem/content/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]]

算法描述

本题相当于二叉树的层次遍历的变形,就是总结来讲奇数层从右到左打印,偶数层从左到右打印;了解了二叉树层次遍历的本质了就简单了;就是将问题从一次处理一个结点变成处理一层结点,按奇偶反转结果加入结果集就解决了,思维需要理解,实现代码复杂度相对中等

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
+++++++++++++以后补++++++++++++++++++