【问题描述】
如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯
一的一棵二叉树。试编写实现上述功能的程序。
【基本要求】
已知一棵二叉树的前序和中序序列,试设计完成下列任务的一个
算法:
(1)构造一棵二叉树;
(2)以凹入表形式输出二叉树。
(3)证明构造正确(即分别以前序和中序遍历该树,将得到的结
果与给出的序列进行比较)。
【测试数据】
前序序列为ABDEGCFHIJ,中序序列为DBGEAHFIJC。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
typedef struct Node
{
char data;
struct Node *leftChild;
struct Node *rightChild;
}BiTreeNode;
void Initiate(BiTreeNode **root)
{
*root=(BiTreeNode *)malloc(sizeof(BiTreeNode));
(*root)->leftChild=NULL;
(*root)->rightChild=NULL;
}
BiTreeNode *InsertLeftNode(BiTreeNode *curr,char x)
{
BiTreeNode *s,*t;
if(curr==NULL) return NULL;
t=curr->leftChild;
s=(BiTreeNode *)malloc(sizeof(BiTreeNode));
s->data=x;
s->leftChild=t;
s->rightChild=NULL;
curr->leftChild=s;
return curr->leftChild;
}
BiTreeNode *InsertRightNode(BiTreeNode *curr,char x)
{
BiTreeNode *s,*t;
if(curr==NULL) return NULL;
t=curr->rightChild;
s=(BiTreeNode *)malloc(sizeof(BiTreeNode));
s->data=x;
s->rightChild=t;
s->leftChild=NULL;
curr->rightChild=s;
return curr->rightChild;
}
void PrintBiTree(BiTreeNode *bt,int n)
{
int i;
if(bt==NULL) return;
PrintBiTree(bt->rightChild,n+1);
for(i=0;i<n-1;i++) printf(" ");
if(n>0)
{
printf("---");
printf("%c\n",bt->data);
}
PrintBiTree(bt->leftChild,n+1);
}
void Visit(char item)
{
printf("%c ",item);
}
void PreOrder(BiTreeNode *t,void Visit(char item))
{
if(t!=NULL)
{
Visit(t->data);
PreOrder(t->leftChild,Visit);
PreOrder(t->rightChild,Visit);
}
}
void InOrder(BiTreeNode *t,void Visit(char item))
{
if(t!=NULL)
{
InOrder(t->leftChild,Visit);
Visit(t->data);
InOrder(t->rightChild,Visit);
}
}
int Search(char str[],char t)
{
int i=0;
while(str[i]!=t)
i++;
return i;
}
int SearchLeft(int Num[],int t)
{
int i;
i=t;
while(Num[i]!=1&&i>=0)
i--;
if(Num[i]==1)
return i;
else return -1;
}
int SearchRight(int Num[],int t)
{
int i;
i=t;
while(Num[i]!=1&&i<=10000)
i++;
if(Num[i]==1)
return i;
else return -1;
}
int main()
{
int i;
BiTreeNode *q[10000];
BiTreeNode *root;
int left,right,temp;
int Num[10000]={0};
char strA[10000];
char strB[10000];
char point;
int n;
printf("请输入前序遍历:");
scanf("%s",strA);
printf("请输入中序遍历:");
scanf("%s",strB);
n=strlen(strA);
Initiate(&root);
for(i=0;i<n;i++)
{
point=strA[i];
temp=Search(strB,point);
left=SearchLeft(Num,temp);
right=SearchRight(Num,temp);
if(left==-1&&right==-1)
{
q[temp]=InsertLeftNode(root,point);
Num[temp]=1;
}
else if(left!=-1&&q[left]->rightChild==NULL)
{
q[temp]=InsertRightNode(q[left],point);
Num[temp]=1;
}
else if(right!=-1&&q[right]->leftChild==NULL)
{
q[temp]=InsertLeftNode(q[right],point);
Num[temp]=1;
}
}
PrintBiTree(root,0);
printf("前序遍历: \n\n");
PreOrder(root->leftChild,Visit);
printf("\n中序遍历:\n");
InOrder(root->leftChild,Visit);
printf("\n\n by :192132 孟凡强\n");
return 0;
}