zoukankan      html  css  js  c++  java
  • 树—线索二叉树的创建&二叉树的后序遍历&中序线索化&中序遍历线索二叉树

    #include <stdio.h>
    #include <stdlib.h>
    #define OVERFLOW 0
    typedef char TElemType;
    typedef enum {Link,Thread}PointerTag;
    typedef struct BiThrNode
    {
        TElemType data;
        struct BiThrNode *lchild,*rchild;
        PointerTag LTag;
        PointerTag RTag;
    }BiThrNode,*BiThrTree;
    BiThrTree pre;
    void CreateBiThrTree(BiThrTree *T);
    void PostOrderTravese(BiThrTree T);
    void InThreading(BiThrTree p);
    int InOrderThreading(BiThrTree *Thrt,BiThrTree T);
    void InOrderTraverse_Thr(BiThrTree T);
    int main()
    {
        BiThrTree T;
        BiThrTree t;
        CreateBiThrTree(&T);
        PostOrderTravese(T);
        printf("
    %d
    ",InOrderThreading(&t,T));//只需要t是指针,因为t起着头结点的作用,连接上T后就成了新的有头结点的二叉树结构。
        InOrderTraverse_Thr(t);
        return 0;
    }
    
    void CreateBiThrTree(BiThrTree *T)//前序遍历序列:AB#D##C##
    {
        TElemType ch;
        scanf("%c",&ch);
        if(ch=='#')
        {
            *T=NULL;
        }
        else
        {
            *T=(BiThrTree)malloc(sizeof(BiThrNode));
            if(!*T)
                exit(OVERFLOW);
            (*T)->data=ch; /* 生成根结点(前序) */
            CreateBiThrTree(&(*T)->lchild); /* 递归构造左子树 */
            if((*T)->lchild) /* 有左孩子 */
                (*T)->LTag=Link;
            CreateBiThrTree(&(*T)->rchild); /* 递归构造右子树 */
            if((*T)->rchild) /* 有右孩子 */
                (*T)->RTag=Link;
        }
    }
    void PostOrderTravese(BiThrTree T)
    {
        if(T==NULL)
            return;
        PostOrderTravese(T->lchild);
        PostOrderTravese(T->rchild);
        printf("%c",T->data);
    }
    
    void InThreading(BiThrTree p)
    {
    
    
        if(p)
        {
            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);
    
        }
    }
    int InOrderThreading(BiThrTree *Thrt,BiThrTree T)//形参是指针原来的变量要变,非指针原来的变量不变。
    {
        *Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
        if(!*Thrt)
            exit(OVERFLOW);
        (*Thrt)->LTag=Link;
        (*Thrt)->RTag=Thread;
        (*Thrt)->rchild=(*Thrt);
        if(!T)
            (*Thrt)->lchild=(*Thrt);
        else
        {
            (*Thrt)->lchild=T;
            pre=(*Thrt);
            InThreading(T);
            pre->rchild=*Thrt;
            pre->RTag=Thread;
            (*Thrt)->rchild=pre;
        }
        return 1;
    }
    void InOrderTraverse_Thr(BiThrTree T)
    {
        BiThrTree p;
        p=T->lchild;
        while(p!=T)
        {
            while(p->LTag==Link)
            {
                p=p->lchild;
            }
            printf("%c",p->data);
            while(p->RTag==Thread&&p->rchild!=T)
            {
                p=p->rchild;
                printf("%c",p->data);
            }
            p=p->rchild;
        }
    }

      一.C语言知识复习:

    线索二叉树用到了枚举类型,其语法和结构的语法差不多,下面复习了一下我不是很熟练的知识点。

    enumerated type

    目的:提高程序的可读性。

    ②定义(以上面所写的为例):

    enum {Link,Thread}PointerTag;
    PointerTag LTag;
    1,声明结构的过程和定义结构变量的过程可以被合并成一步,如上所示。
    2,枚举常量可以限定为任意一种整数类型(如unsigned char)。
    3,在使用整数常量的任意地方都可以使用枚举常量。

    二.数据结构的定义
    关于数据结构的定义,在学习了几个结构定义之后,我才明白,像二叉树这种在定义的内部又定义自己的定义是采用的递归的方式。


    祝你早日攒够失望,然后开始新的生活。
  • 相关阅读:
    我藏在你的心里,你却不愿意寻找# BUG躲猫猫
    阴间需求之跨端登录
    神奇的props
    map与filter:你先我先?
    阴间BUG之动态路由刷新几率回首页
    阴间BUG之动态路由添加失败
    我在eltable就变了个模样,请你不要再想我,想起我
    SCP打包部署方法
    indexOf 与 includes
    YACC和BISON学习心得
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/6374767.html
Copyright © 2011-2022 走看看