别让我逮到 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 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)