一个基础的线索二叉树遍历代码解析讲解

将数据类型进行重定义-方便一次性改变数据类型,线索存储标志位,Link(0):表示指向左右孩子的指针,Thread(1):表示指向前驱后续的线索,PointerTag只能在枚举的所定的范围内选取,假如对于枚举中特殊的用法还未链接的小伙伴可以看这个链接https://blog.csdn.net/weixin_46399138/article/details/106753889?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162228878416780262529110%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162228878416780262529110&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-1-106753889.pc_search_result_cache&utm_term=%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%9E%8Benum%E7%94%A8%E6%B3%95&spm=1018.2226.3001.4187

还有这个链接http://blog.sina.com.cn/s/blog_17de396f70102y7d3.htmlhttp://blog.sina.com.cn/s/blog_17de396f70102y7d3.html这样就能对齐有个清晰的认识。

#include<stdio.h>
#include<stdlib.h>

typedef char ElemType;
typedef enum{Link,Thread}PointerTag;

定义树的结点,结构指针作用相当于用来递归进行使用

    PointerTag ltag,rtag只能在枚举的所定的范围内选取

BiThrNode,*BiThrTree不只是指树而且还可以在对用结点进行指针对应地址标志

typedef struct BiThrNode
{
    char data;
    struct BiThrNode *lchild,*rchild;
    PointerTag ltag,rtag;
}BiThrNode,*BiThrTree;

BiThrTree pre;全局变量,始终指向刚刚访问过的结点

//全局变量,始终指向刚刚访问过的结点
BiThrTree pre;

//创建一颗二叉树,约定用户遵照前序遍历的方式输入数据,这个使中序遍历的,传入的参数是树的指针也可以说是数的地址 char c/定义要存在树里面得到数据if(' '==c)//判断传进去数据是否为空或则为空格,如果为空,则变成空指针没有后来的指向,如果输入的部位空的话就进行数据的存储和指针的指向,malloc/创造出对应的树的空间,(*T)->data=c将数据存储进去其中T->data 这个是this指针地指向就是相当于x=x(是指后面地x是改过地)(*T)->ltag=Link开始确定该地址指向可以有左右孩子,CreateBiTree(&(*T)->lchild)


void CreateBiTree(BiThrTree *T) 
{
    char c; 
    scanf("%c",&c); 
    if(' '==c) 
    {
        *T=NULL; 
    }
    else 
    {
        *T=(BiThrNode *)malloc(sizeof(BiThrNode)); 
        (*T)->data=c; 
        (*T)->ltag=Link;
        (*T)->rtag=Link;
        CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);
    }
}

嵌套中的嵌套,就是将下一个左右孩子的地址拿出来再次创造出新的空间。

中序遍历线索化,开始进行中序遍历,if(T)条件//如果T存在部位null空,则就可以进行遍历,先不断地往下找进行遍历,直到对应结点或树地下一个孩子也就是子叶为空时停止,if(!T->lchild)//就如一直遍历到最后空指针时,T->ltag=Thread;//在该这个树进行表值他是有数据地


void InThreading(BiThrTree T) 
{
    if(T) 
    {
         
        InThreading(T->lchild); 
        if(!T->lchild) 
        {
            T->ltag=Thread; 
            T->lchild=T; 
        }
        pre=T; 
        Inthreading(T->rchild);
    }
}

有序地开始遍历,将最开始树,头结点和后面地树结点进行传入

 
void InOrderThreading(BiThrTree *p,BiThrTree T) 
{
    *p=(BiThrTree)malloc(sizeof(BiThrNode)); 
    (*p)->ltag=Link; 
    (*p)->rtag=Thread; 
    (*p)->rchild=*p; 
    if(!T) 
    {
        (*p)->lchild=T; 
        pre=*p; 
        InThreading(T); 
        pre->rchild=*p; 
        pre->rtag=Thread; 
        (*p)->rchild=pre; 
    }
}

读取在树中存储的数据

void visit(char c) 
{
    printf("%c",c); 
}

中序遍历二叉树,非递归,订单开始将树中存储的信息并不断的读出来,定义一个临时的点树进行暂存像temp那样当中间媒介那样,(p!=T)//加如它存储的不是下面哪一个的上面的树依旧是最后一颗树的子叶指向它树的本身的结点就进行下面。

 
void InOrderTraverse(BiThrTree T) 
{
    BiThrTree p; 
    p=T->lchild; 
    while(p!=T) 
    {
        while(p->ltag==Link) 
        {
            p=p->lchild;  
        }
        visit(p->data); 
        while(p->rtag==Thread&&p->rchild!=T) 
        {
            p=p->rchild; 
            visit(p->data); 
        }
        p=p->rchild; 
    }
}

剩下就没什么了就是简单的实现和使用。

int main()
{
    BiThrTree P,T=NULL;//最开始就行NULL定义最初话进行
    CreateBiTree(&T);//开始创造用户需要的树开始
    InOrderThreading(&P,T);//将头结点和头树开始遍历查找
    printf("中序遍历输出结果为:");
    InOrderTraverse(p);//输入查按照的值
    printf("\n");
    return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值