栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言数据结构学习笔记(12)-线索二叉树的创建和遍历

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言数据结构学习笔记(12)-线索二叉树的创建和遍历


# include
# include
typedef enum {link, Thread} PointerTag;//link为0表示指向左右孩子结点,Thread为1表示设置前驱或后继结点
# define ElemType char
typedef struct BiThrNode{
    ElemType data;
    struct BiThrNode *lchild, *rchild;
    PointerTag lTag, rTag;
}BiThrNode, *BiThrTree;
BiThrTree pre;//定义全局变量始终指向前一个访问的结点
void CreateBiThrTree(BiThrTree * proot);//创建线索二叉树
void InOrderThreading(BiThrTree root, BiThrTree * H);//中序线索化二叉树并加入头结点
void InThreading(BiThrTree p);//中序线索化二叉树
void InOrderTree(BiThrTree H);//中序遍历二叉树
void ReverseInOrderTree(BiThrTree H);//中序遍历二叉树逆序
int main(void)
{    
    BiThrTree root, H;
    CreateBiThrTree(&root);
    InOrderThreading(root, &H);
    printf("中序遍历:");
    InOrderTree(H);
    printf("n");
    printf("中序遍历逆序:");
    ReverseInOrderTree(H);
    printf("n");
    system("pause");
    return 0;
}
void CreateBiThrTree(BiThrTree * proot)//创建线索二叉树
{
    ElemType elem;
    scanf("%c", &elem);
    if('#' == elem)
        *proot = NULL;
    else
    {
        *proot = (BiThrTree)malloc(sizeof(BiThrNode));
        if(NULL == *proot)
            exit(-1);
        (*proot)->data = elem;
        CreateBiThrTree(&(*proot)->lchild);
        if((*proot)->lchild)
            (*proot)->lTag = link;
        CreateBiThrTree(&(*proot)->rchild);
        if((*proot)->rchild)
            (*proot)->rTag = link;
    }
}
void InOrderThreading(BiThrTree root, BiThrTree * H)//中序线索化二叉树并加入头结点
{
    *H = (BiThrTree)malloc(sizeof(BiThrNode));//建立头结点
    if(NULL == *H)
        exit(-1);
    (*H)->lTag = link;
    (*H)->rTag = Thread;
    (*H)->rchild = *H;//右指针回指
    if(root == NULL)
        (*H)->lchild = *H;//若二叉树空,则左指针回指
    else
    {
        (*H)->lchild = root;
        pre = *H;
        InThreading(root);
        pre->rchild = *H;
        pre->rTag = Thread;
        (*H)->rchild = pre;
    }
}
void InThreading(BiThrTree p)//中序线索化二叉树
{    
    if(NULL == p)
        return;
    InThreading(p->lchild);
    if(!p->lchild)
    {
        p->lTag = Thread;
        p->lchild = pre;
    }
    if(!pre->rchild)
    {    
        pre->rTag = Thread;
        pre->rchild = p;
    }
    pre = p;
    InThreading(p->rchild);
}
void InOrderTree(BiThrTree H)//中序遍历二叉树
{    
    BiThrTree p;
    p = H->lchild;
    while(p != H)
    {    
        while(p->lTag == link)
            p = p->lchild;
        printf("%c ", p->data);
        while(p->rTag == Thread && p->rchild != H)
        {
            p = p->rchild;
            printf("%c ", p->data);
        }
        p = p->rchild;
    }
}
void ReverseInOrderTree(BiThrTree H)//中序遍历二叉树逆序
{
    BiThrTree p;
    p = H->rchild;
    while(p != H)
    {    
        while(p->rTag == link)
            p = p->rchild;
        printf("%c ", p->data);
        while(p->lTag == Thread && p->lchild != H)
        {
            p = p->lchild;
            printf("%c ", p->data);
        }
        p = p->lchild;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429825.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号