回 帖 发 新 帖 刷新版面

主题:中序线索二叉树实现

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include <stdlib.h>
#include <conio.h>
#define link 0
#define thread 1
typedef struct bithrnode
{
    char data;
    struct bithrnode *lchild,*rchild;
    int ltag,rtag;
}bithrnode,*bithrtree;

bithrtree pre;

creatbitree(bithrnode **t)
{
    char x;
    scanf("%c",&x);
    //fflush(stdin);
    if(x=='#') (*t)=NULL;
    else
     {
       //if(!((*tr)=(struct bithrnode *) malloc(sizeof(struct bithrnode)))) exit(OVERFLOW);
       (*t)=(struct bithrnode *) malloc (sizeof(struct bithrnode));
       (*t)->data=x;
       creatbitree(&((*t)->lchild));
       creatbitree(&((*t)->rchild));
     }
}

pritorder(bithrtree tp)
 {
    if(tp!=NULL)
     {
        pritorder(tp->lchild);
        printf("%c,%d,%d\n",tp->data,tp->ltag,tp->rtag);
        pritorder(tp->rchild);
     }
    else return EOF;
 }

inorderthr(bithrnode **thrt,bithrtree y)
{
    //(*thrt)=(struct bithrnode *) malloc (sizeof(struct bithrnode));
    (*thrt)->ltag=link;
    printf("%d",(*thrt)->ltag);
    (*thrt)->rtag=thread;
    (*thrt)->rchild=(*thrt);
    if(y==NULL) (*thrt)->lchild=(*thrt);
    else
      {
        (*thrt)->lchild=y;
        pre=(*thrt);
        inthreading(y);
        pre->lchild=(*thrt);
        pre->rtag=thread;
        (*thrt)->rchild=pre;
      }
}

inthreading(bithrtree p)
{
    if(p)
     {
        inthreading(p->lchild);
        if(!p->lchild)
         {
            //printf("%c,%d,%d\n",p->data,p->ltag,p->rtag);
            p->ltag=thread;
            p->lchild=pre;
            //printf("%c,%d,%d\n",p->data,p->ltag,p->rtag);
         }
         if(!p->rchild)
         {
            pre->rtag=thread;
            pre->rchild=p;
            //printf("%c,%d,%d\n",p->data,p->ltag,p->rtag);
         }
         pre=p;
        inthreading(p->rchild);
     }
}

inordertraverse(bithrnode *z)
{
    bithrtree p;
    while(p!=z)
     {
        while(p->ltag==link)
         {
           p=p->lchild;
         }
        //if(p->data=NULL) return EOF;
        while(p->rtag==thread && p->rchild!=z)
         {
            p=p->rchild;
            printf("%c",p->data);
         }
         p=p->rchild;
     }
}

TreeEmpty(bithrtree y)
 { // 初始条件: 树T存在。操作结果: 若T为空树,则返回TURE,否则返回FALSE
   if(y) // T不空
     return -1; //flase
   else
     return 999;//true
 }

main()
{
    bithrtree t;
    bithrnode *thrt;
    thrt=(struct bithrnode *) malloc (sizeof(struct bithrnode));
    printf("Input the bitree:\n");
    creatbitree(&t);
    pritorder(t);
    inorderthr(&thrt,t);
    inordertraverse(thrt);
}
[em18]
各位这个程序,在最后中序线索时,无法显示结果,实在是很奇怪!!!!求救

回复列表 (共2个回复)

沙发


#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include <stdlib.h>
#include <conio.h>
//#define link 0
//#define thread 1

typedef enum {link, thread} PointerTag;/*link = 0指针 Thread = 1线索*/ 
typedef struct bithrnode
{
    char data;
    struct bithrnode *lchild,*rchild;
    PointerTag  ltag,rtag;
}bithrnode,*bithrtree;

bithrtree pre;

creatbitree(bithrnode **t)
{
    char x;
    scanf("%c",&x);
    if(x==' ') 
    (*t)=NULL;
    else
     {
       (*t)=(struct bithrnode *) malloc (sizeof(struct bithrnode));
       creatbitree(&((*t)->lchild));
       (*t)->data=x;
       creatbitree(&((*t)->rchild));
     }
}

pritorder(bithrtree t)
 {
    if(t!=NULL)
     {
        pritorder(t->lchild);
        printf("%4c",t->data);
        pritorder(t->rchild);
     }
}
inorderthr(bithrnode **thrt,bithrtree t)
{
    (*thrt)=(struct bithrnode *) malloc (sizeof(struct bithrnode));
    
    (*thrt)->ltag=link;
    (*thrt)->rtag=thread;
    (*thrt)->rchild=(*thrt);
    
    if(t==NULL) 
    {
        (*thrt)->lchild=(*thrt);
    }
    else
    {
        (*thrt)->lchild=t;
        pre=(*thrt);
        inthreading(t);
        pre->rchild=(*thrt);//这里,最后一个结点是右孩子 
        pre->rtag=thread;
        (*thrt)->rchild=pre;
    }
}
inthreading(bithrtree t)
{
    bithrnode *p;
    p = t;
    if(p)
    {
        inthreading(p->lchild);
        if(!p->lchild)
        {
            p->ltag=thread;
            p->lchild=pre;
         }
         else
         {
             p->ltag = link;
         }
         if(!pre->rchild)//这里 
         {
            pre->rtag=thread;
            pre->rchild=p;
         }
         pre=p;
         p->rtag = link;
         inthreading(p->rchild);
    }
}
inordertraverse(bithrnode *t)
{
    bithrtree p;
    p = t->lchild;//这里 
    printf("\n线索化二叉树输出是 : \n");
    while(p!=t)
    {
        while(p->ltag==link)
        {
           p=p->lchild;
        }
        printf("%4c",p->data);//这里 
        while(p->rtag==thread && p->rchild!=t)
        {
            p=p->rchild;
            printf("%4c", p->data);
        }
        p=p->rchild;
    }
     printf("%4c",p->data);//这里 
}
int main()
{
    bithrtree t;
    bithrnode *thrt;
    printf("Input the bitree:\n");
    creatbitree(&t);
    pritorder(t);
    
    inorderthr(&thrt,t);
    inordertraverse(t);
    
    getch();
}

板凳

原来还是有那么严重的错误,看来自己还是太差了,谢谢:xieyong456

我来回复

您尚未登录,请登录后再回复。点此登录或注册