03-树3 Tree Traversals Again

An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(); push(4); pop(); pop(); push(5); push(6); pop(); pop(). Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations. Your task is to give the postorder traversal sequence of this tree.

Figure 1
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (≤30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2N lines follow, each describes a stack operation in the format: “Push X” where X is the index of the node being pushed onto the stack; or “Pop” meaning to pop one node from the stack.

Output Specification:
For each test case, print the postorder traversal sequence of the corresponding tree in one line. A solution is guaranteed to exist. All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.

#include <iostream>
#include<cstdlib>
using namespace std;

void BuildArray(int pre[], int in[], int N);
void Solve(int pre[], int in[], int post[], int preL, int inL, int postL, int N);

int main()
{
	int pre[30], in[30], post[30];
	int N, i;
	
	cin >> N;
	BuildArray(pre, in, N);
	Solve(pre, in, post, 0, 0, 0, N);

	cout << post[0];
	for (i = 1; i < N; i++) {
		cout << " " << post[i];
	}
	
	return 0;
}

void BuildArray(int pre[], int in[], int N)
{
	int top = -1, i = -1, j = -1;		//分别是stack指针,pre指针,in指针
	int Stack[30];
	string str;
	int data, cnt=0;

	do {
		cin >> str;
		if (str == "Push") {
			cin >> data;
			Stack[++top] = data;
			pre[++i] = data;
		}
		else if (str == "Pop") {
			in[++j] = Stack[top--];
			cnt++;
		}
	} while (cnt != N);

}

void Solve(int pre[], int in[], int post[], int preL, int inL, int postL, int N)
{
	if (N == 0) return;			//递归到最右的右边时return
	if (N == 1) {				
		post[postL] = pre[preL];		//只有一个节点时,直接填入
		return;
	}

	int root, i, L, R;

	root = pre[preL];			//前序第一个值为根节点
	post[postL + N - 1] = root;		//容量中最后一个节点为根节点
	for (i = 0; i < N; i++)
		if (in[inL + i] == root) break;			//中序中找到root所在位置
	L = i;				//左节点个数为中序root左边
	R = N - i - 1;		//右节点个数为中序root右边
			
	Solve(pre, in, post, preL + 1, inL, postL, L);			//左子树递归
	Solve(pre, in, post, preL + L + 1, inL + L + 1, postL + L, R);			//右子树递归
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值