• 05---二叉树---20195106064---陈昕.c


    //输入只有一行,包含一个字符串S,用来建立二叉树。保证S为合法的二叉树先序遍历字符串,节点内容只有大写字母,且S的长度不超过100。
    //共一行,包含一串字符,表示按中序遍历二叉线索树得出的节点内容,每个字母后输出一个空格。请注意行尾输出换行。
    //例如;ABC  DE G  F
    
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct {
        char ch;
    }ElemType;
    typedef enum {Link,Thread} PointerTag;
    typedef struct BiTNode{
        ElemType elem;
        struct BiTNode *Lchild;
        struct BiTNode *Rchild;
        PointerTag LTag;
        PointerTag RTag;
    }BiTNode,*BiTree;
    
    BiTree pre;
    void CreatTree(BiTree *T);
    
    void InOrderThreading(BiTree *Thrt,BiTree T);
    void InThreading(BiTree p);
    void InOrderTraverse(BiTree T);
    void Z_Traverse(BiTree T);
    int main()
    {
        BiTree T;
        CreatTree(&T);
        BiTree Thrt;
        InOrderThreading(&Thrt,T);//中序线索化
        InOrderTraverse(Thrt);//中序遍历
    }
    void CreatTree(BiTree *T)//前序遍历建立二叉树
    {
        char a;
        scanf("%c",&a);
        if(a==' ')
        {
            *T=NULL;
        }
        else
        {
            *T=(BiTree)malloc(sizeof(BiTNode));
            (*T)->elem.ch=a;
            (*T)->LTag=Link;//初始化
            (*T)->RTag=Link;//初始化
            CreatTree( &( (*T)->Lchild ) );
            CreatTree( &( (*T)->Rchild ) );
        }
    }
    void InOrderThreading(BiTree *Thrt,BiTree T)
    {
        (*Thrt) = (BiTree)malloc(sizeof(BiTNode));
    
        (*Thrt)->Rchild=*Thrt;//右指针回指
        (*Thrt)->RTag=Link;//初始化
        if(!T)//如果树是空 左指针也回指
        {
            (*Thrt)->Lchild=*Thrt;
            (*Thrt)->LTag=Link;
        }
        else
        {
            pre=*Thrt;
            (*Thrt)->Lchild=T;
            (*Thrt)->LTag=Link;
            InThreading(T);//线索化
            pre->Rchild=*Thrt;
            pre->RTag=Thread;
            (*Thrt)->Rchild=pre;
        }
    }
    void InThreading(BiTree 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);
        }
    }
    void InOrderTraverse(BiTree T)//遍历线索化二叉树
    {
        BiTree p;
        p=T->Lchild;
        while(p!=T)
        {
            while(p->LTag==Link)//找到第一个左孩子为空的节点
            {
                p=p->Lchild;
            }
            printf("%c ",p->elem.ch);
            while(p->RTag==Thread&&p->Rchild!=T)//线索不为空&&不是最后一个节点
            {
                p=p->Rchild;//根据线索遍历
                printf("%c ",p->elem.ch);
            }
            p=p->Rchild;//转到右子树
        }
    }
    
  • 相关阅读:
    NOI2021 题解
    CF605E Intergalaxy Trips
    P4762 [CERC2014]Virus synthesis
    特征向量与特征值
    uoj
    NOI 2021
    [NOI2011] NOI 嘉年华 【DP】
    CF1264D(组合数)
    绝对不咕
    题解 SP11985 【GOT
  • 原文地址:https://www.cnblogs.com/ztguang/p/14199882.html
Copyright © 2020-2023  润新知