Description
按先序顺序和中序顺序输入二叉树的2个遍历序列,采用二叉链表建立该二叉树并用后序遍历顺序输出该二叉树的后序遍历序列。
Input
输入数据有多组,对于每组测试数据
第一行输入二叉树的先序序列,第二行为中序序列。
Output
对于每组测试数据输出该二叉树的后序序列
Sample Input
abdcef
dbaecf
Hint
dbefca
代码区:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<string.h>
using namespace std;
typedef struct Node//定义结构体
{
char data;
struct Node *lroot,*rroot;//左右子树
}Node,*LinkList;//两个名字第一个是结点,第二个是链表,方便区分
LinkList Create(int n,char* pre,char* mid)//由先序序列和中序序列创建二叉树
{
LinkList root;
int i;//标记变量
if(n==0)return NULL;//如果n是0说明没有数据了,就赋值NULL(给指针一个归属)
root=(LinkList)malloc(sizeof(Node));//开辟空间给root
root->data=pre[0];//先序序列的第一个数是根节点
for(i=0;i<n;i++)//找出中序序列中与根节点相同的数的位置为i
{
if(pre[0]==mid[i])//当找到时退出循环
break;
}
root->lroot=Create(i,pre+1,mid);
//创造左子树,i是左子树中的元素数量,因为根节点已经取到了所以需要将pre+1,mid序列不变
root->rroot=Create(n-i-1,pre+i+1,mid+1+i);
//创造右子树,n-i-1为右子树的元素数量,先序序列的前i个都是左子树中的值,所以将pre+i再+1之后的就是左子树的值
//中序序列同理,也为mid+i+1
return root;//返回头结点root
}
void show(LinkList root)//将树以后序序列输出
{
if(root)//如果非空就继续
{
show(root->lroot);
show(root->rroot);
cout << root->data;
//先遍历左子树再右子树再输出(这样是符合后序序列)
}
}
int main()
{
LinkList root=NULL;//定义root变量
char a[105],b[105];//由于题目中没有明确给出先序序列中数的个数为多少,所以就先定义一个105嘿嘿
int len;//长度
cin >> a >> b;//输入先序序列和中序序列
len=strlen(a);
root=Create(len,a,b);//调用函数
show(root);//输出
return 0;
}
新手上路,有错请指正