中序线索二叉树

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

#define MaxSize 50

typedef int  Elemtype;


//线索二叉树的定义
typedef struct ThreadNode
{
    Elemtype data;
    struct TreadNode *lchild,*rchild;
    int ltag,rtag;
} ThreadNode,*ThreadTree;

ThreadTree pre; //开全局变量pre

ThreadTree CreateLink()
{
    int data;
    ThreadTree T;

    scanf("%d",&data);

    if(data==-1)return NULL;
    else
    {
        T=(ThreadTree)malloc(sizeof(ThreadNode));
        T->data=data;
        T->ltag=0,T->rtag=0;
        printf("请输入%d的左子树: ",T->data);
        T->lchild=CreateLink();
        printf("请输入%d的右子树: ",T->data);
        T->rchild=CreateLink();
        return T;
    }
}


//中序线索二叉树的构造
void InThread(ThreadTree p)
{
    if(p!=NULL)
    {
        InThread(p->lchild);//递归,线索左子树
        if(p->lchild==NULL) //递归到底时
        {
            p->lchild=pre;//lchild前驱为pre
            p->ltag=1;//标记p有了前序线索
        }
        //有左孩子,不会有ltag,有有孩子不会有rtag
        if(pre!=NULL&&pre->rchild==NULL) //更新pre的后继线索
        {
            pre->rchild=p;
            pre->rtag=1;
        }
        pre=p;
        InThread(p->rchild); //向右递归
    }
}

void CreateInThread(ThreadTree T)
{
    if(T!=NULL)
    {
        InThread(T);
        pre->rchild=NULL; //最右侧结点,为最后遍历的一个结点,故需要将rchild复制NULL
        pre->rtag=1;
    }
}


//获取首结点
ThreadTree  Firstnode(ThreadTree p)
{
    while(p->ltag==0)p=p->lchild; //找到最左侧结点
    return p;
}

//找出当前结点的后继结点
ThreadTree Nextnode(ThreadTree p)
{
    if(p->rtag==0) return Firstnode(p->rchild); //有右孩子,需要找到右子树的最左侧结点
    else return p->rchild;//存在右标记,则返回后继结点
}

void visit(ThreadTree p)
{
    printf("%d  ",p->data);
}
//中序线索二叉树的遍历
void InOrder(ThreadTree T)
{
    for(ThreadTree p=Firstnode(T); p!=NULL; p=Nextnode(p))
        visit(p);
}

int main()
{

    ThreadTree T;
    printf("请输入根节点数据: ");
    T=CreateLink();// 1 2 -1 4 6 -1 -1 -1 3 -1 5 -1 -1
    printf("输入完成\n");
    CreateInThread(T);
    printf("创建线索完成\n");
    InOrder(T);// 2 6 4 1 3 5




    return 0;
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值