1127 ZigZagging on a Tree (30分)

题目链接: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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值