建立二叉树的二叉链表(已知先序和中序,求后序)
#include <stdio.h> #include <stdlib.h> #include <string.h> //原理:由前序和中序可以确定唯一的二叉树 typedef struct Node { char Data; struct Node* LChild; struct Node* RChild; //先序遍历创建 }BiTNode,*PBiTNode; char pre[200],in[200]; PBiTNode CreatepostBiTree(int pre_start,int pre_end,int in_start,int in_end) { int i,LTreeLen,RTreeLen; PBiTNode T; T=(PBiTNode)malloc(sizeof(BiTNode)); //建立根节点 T->Data=pre[pre_start]; //遍历前序储存的结点,因为是先序,所以树第一个是数一定是A, T->LChild=T->RChild=NULL; //置空的方法。 i=in_start; while(in[i]!=T->Data) i++; LTreeLen=i-in_start; //左子树长度 ,这自己画下图就可以知道。 RTreeLen=in_end-i; //右子树长度 if(LTreeLen) //LTreeLen长度为0就结束。 T->LChild=CreatepostBiTree(pre_start+1,pre_start+LTreeLen,in_start,i-1); //啊,这个规律记住就行。 if(RTreeLen) T->RChild=CreatepostBiTree(pre_start+LTreeLen+1,pre_end,i+1,in_end); return T; //一个对一个就直接return; } PBiTNode temp() { PBiTNode T; int Len_pre,Len_in; Len_pre=strlen(pre); Len_in=strlen(in); T=CreatepostBiTree(0,Len_pre-1,0,Len_in-1); return T; } void print(PBiTNode bt) { if(bt!=NULL) { print(bt->LChild); print(bt->RChild); printf("%c",bt->Data); } } int main() { PBiTNode bt; scanf("%s",pre); getchar(); scanf("%s",in); bt=temp(); print(bt); printf("\n"); return 0; }