题目不难,理解了中序,先序,后序是怎么创建和遍历二叉树的就很简单;
代码上我写了注解,便于理解。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef struct node
{
char data;
struct node *L_Kid,*R_Kid;
}Tree;
Tree *CreateTree(char *first,char *mid,int len)
{
Tree *root;
int cnt=0;
if(len<=0) return NULL;//树里没有任何元素,返回NULL;
root=new Tree();//在堆中给root申请空间;
root->data=*first;//先序遍历的第一个元素就是根结点;
char *i;
for(i=mid;i<mid+len;i++)
{
if(*i==root->data) break;//第一次找的时候是找到位于中序遍历中根结点的位置;
}
int k=i-mid;//k表示当前位于中序遍历的位置;
root->L_Kid=CreateTree(first+1,mid,k);//创建左子树;
root->R_Kid=CreateTree(first+k+1,i+1,len-k-1);//创建右子树;
return root;
}
void Traverse(Tree *T)
{
if(T!=NULL)
{
Traverse(T->L_Kid);
Traverse(T->R_Kid);//后序遍历,左右根;
cout<<T->data;
}
}
int main()
{
char first[1005],mid[1005];
cin>>mid>>first;//先输入中序遍历再输入后序遍历;
int len=strlen(mid);//确定树里面的结点数;
Tree *root=CreateTree(first,mid,len);
Traverse(root);
return 0;
}