问题 E: 根据前序+中序还原二叉树

题目描述

用一棵二叉树的前序遍历序和中序遍历序可以唯一确定一棵二叉树。

输入格式

每行输入为一棵非空二叉树的前序遍历序串和中序遍历序串(两串长度均不超过2000),前序遍历序和中序遍历序中间用一个空格隔开。 每个结点为一个字符(字母或数字),且不存在相同结点。

输出格式

对每行输入,输出对应二叉树的后序遍历序后换行

输入样例

abc bac
ab ba

输出样例  

bca
ba

代码展示 

递归实现

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;

struct BiNode{
	char data;
	BiNode *lchild,*rchild;
};
typedef BiNode *BiTree;

BiTree pre_mid_build(char* pre,char* mid,int num){
	if(pre==NULL||mid==NULL||num<=0)
		return NULL;

	BiTree root=new BiNode;
	root->data=pre[0];
	root->lchild=NULL;root->rchild=NULL;

	if(num==1)  return root;
	
	int left_num=0;//左子树结点总数
	char* middle_root=mid;

	while(*middle_root!=pre[0]&&middle_root<=(mid+num-1)){
		middle_root++;
		left_num++;
	}

	if(left_num>0)//创建左子树
		root->lchild=pre_mid_build(pre+1,mid,left_num);
	if(num-left_num-1>0)//创建右子树
		root->rchild=pre_mid_build(pre+left_num+1,mid+left_num+1,num-left_num-1);
	return root;
}

int SucTraverse(BiTree T){//后序遍历
	if(T==nullptr)  return 0;
	SucTraverse(T->lchild);
	SucTraverse(T->rchild);
	cout<<T->data;
	return 0;
}

int DestroyBiTree(BiTree &T){//销毁二叉树
	if(T==nullptr)  return 0;
	DestroyBiTree(T->lchild);
	DestroyBiTree(T->rchild);
	delete T;
	T=nullptr;
	return 0;
}

int main(){
	//freopen("/config/workspace/test/test","r",stdin);
	string pre;
	string mid;
	while(cin>>pre>>mid){
		char P[2001];
		char M[2001];
		for(int i=0;i<pre.length();i++){
			P[i]=pre[i];
			M[i]=mid[i];
		}
		BiTree root=pre_mid_build(P,M,pre.length());
		SucTraverse(root);
		DestroyBiTree(root);
		cout<<endl;
	}
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值