复原二叉树

问题 A: 复原二叉树
时间限制: 1 Sec 内存限制: 32 MB
提交: 247 解决: 149
[提交][状态][讨论版][命题人:外部导入]
题目描述
小明在做数据结构的作业,其中一题是给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。
输入
输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由不重复的大写字母组成。
输出
对于每组输入,输出对应的二叉树的后续遍历结果。
样例输入
DBACEGF ABCDEFG
BCAD CBAD
样例输出
ACBFGED
CDAB
自己代码:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 50;
struct node{
	char data;
	node* lchild;
	node* rchild;
};
char pre[maxn], in[maxn], post[maxn];//先序、中序、后序
int n;//结点个数
//当前二叉树的先序序列区间为[preL,preR],中序序列区间为[inL,inR]
//create函数返回构建出的二叉树根结点地址
node* create(int preL, int preR, int inL, int inR) {
	if (preL > preR) return NULL;//先序序列长度小于等于0
	node* root = new node;//新建一个新的结点,存放当前二叉树的根结点
	root->data = pre[preL];//新的数据域为根结点的值
	int k;
	for ( k = inL; k <= inR; k++) {
		if (in[k] == pre[preL]) {//在中序序列中找到in[k]==pre[L]的结点
			break;
		}
	}
	int numLeft = k - inL;//左子树的结点个数
	//左子树的先序区间为[preL+1,preL+numLeft],中序区间为[inL,k-1]
	//返回左子树的根结点,赋值给root的左指针
	root->lchild = create(preL + 1, preL + numLeft, inL, k - 1);
	//右子树的先序区间为[preL+numLeft+1,preR],中序区间为[k+1,inR]
	//返回右子树的根结点地址,赋值给root的右指针
	root->rchild = create(preL + numLeft + 1, preR, k + 1, inR);
	return root;//返回根结点地址
}
int num = 0;//已输出结点个数
void postorder(node* root) {
	if (root == NULL) {
	//	return;//达到空树,递归边界
		return;
	}
	//访问左子树
	postorder(root->lchild);
	//访问右子树
	postorder(root->rchild);
	//访问根结点root,例如将其数据域输出
	printf("%c", root->data);
}
int main() {
	string str1, str2;
	int i, j;
	while(cin >> str1 >> str2){
		for (int i = 0; i < str1.length(); i++) {
			pre[i] = str1[i];
		}
		for (int i = 0; i < str2.length(); i++) {
			in[i] = str2[i];
		}
		node* root = create(0, str1.length() - 1, 0, str2.length() - 1);
		postorder(root);
		printf("\n");
	}
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值