题目链接:1127 ZigZagging on a Tree (30分)
题意
根据中序和后序根据层序按z字型输出。
分析
构建颗二叉树,中序左根右,后序左右根,一棵树的后序序列的最后一个为这个树的根结点,然后在中序序列找到根节点元素的位置,该位置左边为左子树,右边为右子树。得到子树的对应长度,划分中序和后序的左右子树序列的下标,然后递归处理。
构建完成树,队列层序处理,根据题意奇数层从右到左,偶数层从左到右,于是奇数层用vector存放,偶数用栈存放,当遇到偶数层的第一个元素时,将栈中的元素依次退栈放到数组中。
代码注意点
(t->level & 1) == 0 && pre == 1
== 的优先级大于 & ,一开始写的是
t->level & 1 == 0 && pre == 1
这样的结果总为0,因为计算机处理先处理 1 == 0 返回false 然后 false & t->level 0 与任何数相与都为0.
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stack>
#include <vector>
#include <queue>
using namespace std;
typedef struct Tree{
int data, level;
struct Tree *ltree, *rtree;
}Tree;
void create(Tree *&root, int in[], int il, int ir, int post[], int pl, int pr);
void bfs(Tree *root);
int main(int argc, char** argv) {
int n;
int in[40], post[40];
Tree *root = NULL;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &in[i]);
for (int i = 0; i < n; i++)
scanf("%d", &post[i]);
create(root, in, 0, n - 1, post, 0, n - 1);
bfs(root);
return 0;
}
void bfs(Tree *root) {
int cnt = 0, pre = 0;
queue<Tree*> que;
root->level = 1;
que.push(root);
vector<int> v;
stack<int> st;
while (!que.empty()) {
Tree *t = que.front();
que.pop();
if (t->ltree) {
t->ltree->level = t->level + 1;
que.push(t->ltree);
}
if (t->rtree) {
t->rtree->level = t->level + 1;
que.push(t->rtree);
}
// == 的优先级大于 &
if ((t->level & 1) == 0 && pre == 1) { // 当前层是偶,上一层为奇,将栈里的元素放入数组
while (!st.empty()) {
v.push_back(st.top());
st.pop();
}
}
if (t->level & 1 == 1) { // 奇右,偶左
st.push(t->data);
pre = 1;
} else {
v.push_back(t->data);
pre = 0;
}
}
while (!st.empty()) {
v.push_back(st.top());
st.pop();
}
for (int i = 0; i < v.size(); i++) {
if (i == 0)
printf("%d", v[i]);
else
printf(" %d", v[i]);
}
}
void create(Tree *&root, int in[], int il, int ir, int post[], int pl, int pr) {
if (il > ir)
return ;
root = (Tree *) malloc(sizeof(Tree));
root->data = post[pr];
root->ltree = root->rtree = NULL;
int i;
for (i = il; i <= ir; i++) {
if (in[i] == post[pr])
break;
}
int llen = i - il;
int rlen = ir - i;
if (llen != 0)
create(root->ltree, in, il, i - 1, post, pl, pl + llen - 1);
if (rlen != 0)
create(root->rtree, in, i + 1, ir, post, pl + llen, pr - 1);
}