别让我逮到 2019-12-22 17:10 采纳率: 0%
浏览 194

创建及遍历线索二叉树,出了一些小问题

不知道哪里出了问题 创建为先序创建
线索化及遍历都是中序 不知道为什么跑不出来

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//原二叉链表中添加ltag和rtag
//ltag  0表示lchild指向左孩子  1表示lchild指向结点前驱
//rtag  0表示rchild指向右孩子  1表示rchild指向结点后继
/*建立线索化二叉树实质上是遍历一棵二叉树,在遍历过程中检查左右指针域
是否为空,若为空,将指针改为前驱结点或者后继结点的线索*/
enum Ptag{Link,Thread}; //Link(0) Thread(1)
typedef char ElemType;
typedef struct BiTNode
{ 
    ElemType data; 
    struct  BiTNode *lchild, *rchild;
    Ptag ltag,rtag; 
}BiTNode,*BiTree;
BiTree pre=NULL;   //全局变量
void TThread(BiTree p)  //P为根结点的二叉树中序线索化 
{                       //每次判断当前访问节点的ltag和上一次访问节点rtag 
    if(p!=NULL)
    {
        TThread(p->lchild);
        if(p->lchild==NULL){
            p->ltag=Thread;
            p->lchild=pre;
        }
        else
            p->ltag=Link;
        if(pre->rchild==NULL){
            pre->rchild=p;
            pre->rtag=Thread; 
        }
        else 
            pre->rtag=Link;
        pre=p;
        TThread(p->rchild);
    }
}
BiTree CreatTree(BiTree bt)  //对bt根结点的二叉树线索化 增加一个头结点head 
{
    BiTree head;
    head=(BiTree)malloc(sizeof(BiTNode));
    head->ltag=Link;
    head->rtag=Thread;  
    head->rchild=bt;
    if(bt==NULL)
        head->rchild=head;
    else{
        head->lchild=bt;
        pre=head;
        TThread(bt);
        pre->rchild=head;
        pre->rtag=Thread;
        head->rchild=pre;
    }
    return head;
} 
void createBiTree(BiTree *T) //若传值为BiTree T,形参传递而不是实参传递 
{
    ElemType ch;
    scanf("%c",&ch);
    getchar();
//  fflush(stdin);      
    if (ch=='#')
    {      
        *T = NULL;
        return;
    }
    else
    {
        *T = (BiTree)malloc(sizeof(BiTNode));   
        if (!*T)
            exit(1);    
        (*T)->data=ch;              
        printf("请输入左子树:\n");
        createBiTree(&((*T)->lchild));  //左
        printf("请输入右子树:\n");
        createBiTree(&((*T)->rchild));  //右
    }
}
BiTree InFirst(BiTree Bt)     //寻找中序遍历第一个结点 
{
    BiTree p=Bt;
    if(!p) return(NULL);
    while(p->ltag==0){
        p=p->lchild;
    }
    return p;
}
BiTree InNext(BiTree p)      //寻找当前结点的后继结点 
{
    BiTree Next;
    if(p->rtag==1)  Next=p->rchild;
    else{
        BiTree q=NULL;
        for(BiTree q=p->rchild;q->ltag==0;q=q->lchild);
        Next=q;
    }
    return Next;
}
void VisitBt(BiTree p)        //遍历中序线索二叉树 
{
    BiTree q=InFirst(p);
    while(q){
        printf("%d\n",q->ltag);
//      printf("aaaaaaaaaaaaaaaaaaaaaa\n");
        q=InNext(q);
    }
}
int main()
{
    BiTree T,Tree;
    createBiTree(&T);
    Tree=CreatTree(T);
    VisitBt(Tree->lchild);
    return 0;   
}

求帮助 wan'fen'gan'xie

  • 写回答

1条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退
  • ¥20 win系统的PYQT程序生成的数据如何放入云服务器阿里云window版?
  • ¥50 invest生境质量模块
  • ¥15 nhanes加权logistic回归,svyglm函数