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,在使用整数常量的任意地方都可以使用枚举常量。

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


    祝你早日攒够失望,然后开始新的生活。
  • 相关阅读:
    Android Gradle Plugin指南(五)——Build Variants(构建变种版本号)
    文件内容操作篇clearerr fclose fdopen feof fflush fgetc fgets fileno fopen fputc fputs fread freopen fseek ftell fwrite getc getchar gets
    文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write
    嵌入式linux应用程序调试方法
    version control system:git/hg/subversion/cvs/clearcase/vss。software configruation management。代码集成CI:Cruisecontrol/hudson/buildbot
    最值得你所关注的10个C语言开源项目
    如何记录linux终端下的操作日志
    CentOS 5.5 虚拟机安装 VirtualBox 客户端增强功能
    sizeof, strlen区别
    C/C++嵌入式开发面试题
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/6374767.html
Copyright © 2011-2022 走看看