①做到的遍历题,基本不会直接考前中后序了,会再原来的基础上,新定义一种遍历方法,往往只需要改极少的一部分代码,比如invert binary tree,只需要先访问右孩子再访问左孩子,而不需要真正的反转,本题也不需要额外设计一个zigzag遍历函数,只要bfs然后一行正者输出一行逆着输出
②!!!就因为少写了 if(i>=v.size()) break;,一开始被扣了14分,真感觉是个大错误,没想到就少了这个,再循环嵌套的时候,一定要注意会不会越界,溢出等等
③for循环时,stack.size()再pop之后会改变,而且没有clear函数,所以一定要先把size存起来
#include<bits/stdc++.h>
using namespace std;
int n, postorder[41], inorder[41];
struct node {
int v;
node* left = NULL, * right = NULL;
int level = 0;
}*root;
vector<node*> v;
void creat_tree(node*& root, int inL, int inR, int postL, int postR) {
if (inL > inR)
return;
if (root == NULL) {
root = new node;
root->v = postorder[postR];
}
int k;
for (k = inL; k <= inR; k++) {
if (inorder[k] == postorder[postR])
break;
}
int leftlen = k - inL;
creat_tree(root->left, inL, k - 1, postL, postL + leftlen - 1);
creat_tree(root->right, k + 1, inR, postL + leftlen, postR - 1);
}
void getlevel(node* root, int lev) {
if (root == NULL)
return;
root->level = lev;
getlevel(root->left, lev + 1);
getlevel(root->right, lev + 1);
}
void bfs(node* root) {
queue<node*> q;
q.push(root);
int l = 0;
while (!q.empty()) {
node* temp = q.front();
v.push_back(temp);
q.pop();
if (temp->left != NULL)
q.push(temp->left);
if (temp->right != NULL)
q.push(temp->right);
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> inorder[i];
}
for (int i = 0; i < n; i++) {
cin >> postorder[i];
}
creat_tree(root, 0, n - 1, 0, n - 1);
getlevel(root, 0);
bfs(root);
cout << v[0]->v;
stack<int> s;
int i = 1;
while (i < v.size()) {
if (v[i]->level % 2 == 0) {
while (v[i]->level % 2 == 0) {
s.push(v[i]->v);
i++;
if(i>=v.size())
break;
}
int size=s.size();
for (int j = 0; j < size; j++) {
int t = s.top();
s.pop();
cout << " " << t;
}
}
if(i>=v.size()) break;
while (v[i]->level % 2 != 0) {
cout << " " << v[i]->v;
i++;
if(i>=v.size())
break;
}
}
}