由二叉树的前序遍历和中序遍历序列能确定唯一的一棵二叉树,下面程序的作用是实现由已知某二叉树的前序遍历和中序遍历序列,生成一棵用二叉链表表示的二叉树并打印出后序遍历序列,请写出程序所
缺的语句。
#define MAX 100
typedef struct Node{
char info;
struct Node *llink, *rlink;
}TNODE;
char pred[MAX],inod[MAX];//前序遍历序列数组,和中序遍历数组
main(int argc,int **argv){//argc是个啥我也不知道,argv是个二维数组。
TNODE *root;//建立根结点
if(argc<3) exit 0;
strcpy(pred,argv[1]);//复制给pred
strcpy(inod,argv[2]);//复制给inod
root=restore(pred,inod,strlen(pred));//建树
postorder(root);//后序遍历
}
TNODE *restore(char *ppos,char *ipos,int n){//oppos 是先序遍历数组,ipos是中序遍历数组
TNODE *ptrl;//新建一棵树
char *rpos;
int k;
if(n<=0) return NULL;//n是还有多少没有结点没有进到树内
ptr->info = *ppos;//根节点的值为先序的第一个。这里不能写ppos[0],因为这个是个递归,
for(rpos = ipos; rpos<ipos+n;rpos++)
if(*rpos==*ppos) break;//从中序中找到前序的第一个。
k = rpos - ipos;//地址直接减,就是他的位子。
ptr->llink = restore(ppos+1, ipos,k );//ppos的第一个是跟。ppos+1开始的k个和ipos开始的k个构成做左子树
ptr->rlink = restore(ppos+1+k,rpos+1,n-1-k);//ppos+1开始的k个画也就是ppos+1+K,rpos+1(也可以ipos+k+1)就是k和左子树和一个根,后面的是右子树。个数是n-1-k;
return ptr;
}
postorder(TNODE*ptr){
if(ptr=NULL) return;
postorder(ptr->llink);
postorder(ptr->rlink);
printf(“%c”,ptr->info);
}