• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
2014>
博客园    首页    新随笔    联系   管理    订阅  订阅
中科院2000 三
由二叉树的前序遍历和中序遍历序列能确定唯一的一棵二叉树,下面程序的作用是实现由已知某二叉树的前序遍历和中序遍历序列,生成一棵用二叉链表表示的二叉树并打印出后序遍历序列,请写出程序所
缺的语句。
#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);
    
}

 

posted on 2019-08-11 17:30  2014>  阅读(192)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3