第十周——项目一(3)—线索化二叉树(中序)

本文介绍了一种实现二叉树中序线索化的方法,包括二叉树的创建、遍历及线索化的具体步骤。通过C语言实现,展示了如何构建二叉树,并将其转化为中序线索二叉树。
/*             
 * Copyright (c) 2017,烟台大学计算机学院         
 * All right reserved.             
 * 文件名称:btree   
 * 作者:尹娜            
 * 完成日期:2017年11月9日             
 * 版本号:v1.0            
 *             
 * 问题描述:线索化二叉树(中序)     
 * 输入描述:标准函数输入             
 * 程序输出:二叉树序列、线索中序序列        
*/    

#include <stdio.h>
#include <malloc.h>

#define MaxSize 100
typedef char ElemType;
typedef struct node
{
    ElemType data;
    int ltag,rtag;      //增加的线索标记
    struct node *lchild;
    struct node *rchild;
} TBTNode;

void CreateTBTNode(TBTNode * &b,char *str)
{
    TBTNode *St[MaxSize],*p=NULL;
    int top=-1,k,j=0;
    char ch;
    b=NULL;             //建立的二叉树初始时为空
    ch=str[j];
    while (ch!='\0')    //str未扫描完时循环
    {
        switch(ch)
        {
        case '(':
            top++;
            St[top]=p;
            k=1;
            break;      //为左结点
        case ')':
            top--;
            break;
        case ',':
            k=2;
            break;                          //为右结点
        default:
            p=(TBTNode *)malloc(sizeof(TBTNode));
            p->data=ch;
            p->lchild=p->rchild=NULL;
            if (b==NULL)                    //*p为二叉树的根结点
                b=p;
            else                            //已建立二叉树根结点
            {
                switch(k)
                {
                case 1:
                    St[top]->lchild=p;
                    break;
                case 2:
                    St[top]->rchild=p;
                    break;
                }
            }
        }
        j++;
        ch=str[j];
    }
}

void DispTBTNode(TBTNode *b)
{
    if (b!=NULL)
    {
        printf("%c",b->data);
        if (b->lchild!=NULL || b->rchild!=NULL)
        {
            printf("(");
            DispTBTNode(b->lchild);
            if (b->rchild!=NULL) printf(",");
            DispTBTNode(b->rchild);
            printf(")");
        }
    }
}

TBTNode *pre;                       //全局变量

void Thread(TBTNode *&p)
{
    if (p!=NULL)
    {
        Thread(p->lchild);          //左子树线索化
        if (p->lchild==NULL)        //前驱线索
        {
            p->lchild=pre;          //建立当前结点的前驱线索
            p->ltag=1;
        }
        else p->ltag=0;
        if (pre->rchild==NULL)      //后继线索
        {
            pre->rchild=p;          //建立前驱结点的后继线索
            pre->rtag=1;
        }
        else pre->rtag=0;
        pre=p;
        Thread(p->rchild);          //右子树线索化
    }
}

TBTNode *CreaThread(TBTNode *b)     //中序线索化二叉树
{
    TBTNode *root;
    root=(TBTNode *)malloc(sizeof(TBTNode));  //创建根结点
    root->ltag=0;
    root->rtag=1;
    root->rchild=b;
    if (b==NULL)                //空二叉树
        root->lchild=root;
    else
    {
        root->lchild=b;
        pre=root;               //pre是*p的前驱结点,供加线索用
        Thread(b);              //中序遍历线索化二叉树
        pre->rchild=root;       //最后处理,加入指向根结点的线索
        pre->rtag=1;
        root->rchild=pre;       //根结点右线索化
    }
    return root;
}

void ThInOrder(TBTNode *tb)
{
    TBTNode *p=tb->lchild;      //指向根结点
    while (p!=tb)
    {
        while (p->ltag==0) p=p->lchild;
        printf("%c ",p->data);
        while (p->rtag==1 && p->rchild!=tb)
        {
            p=p->rchild;
            printf("%c ",p->data);
        }
        p=p->rchild;
    }
}

int main()
{
    TBTNode *b,*tb;
    CreateTBTNode(b,"A(B(D(,G)),C(E,F))");
    printf(" 二叉树:");
    DispTBTNode(b);
    printf("\n");
    tb=CreaThread(b);
    printf(" 线索中序序列:");
    ThInOrder(tb);
    printf("\n");
    return 0;
}

运行结果:


棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶结点个数是: A. 41 B. 82 C. 113 D. 122 分数 2 作者 严冰 单位 浙大城市学院 二叉树中,双分支结点数为15,单分支结点数为30,则叶子结点数为()个。 A. 15 B. 16 C. 17 D. 47 分数 3 作者 考研真题 单位 浙江大学 对 n 个互不相同的符号进行哈夫曼编码。若生成的哈夫曼树共有 115 个结点,则 n 的值是: A. 56 B. 57 C. 58 D. 60 分数 2 作者 DS课程组 单位 浙江大学 如果二叉树的后遍历结果是FDEBGCA,中遍历结果是FDBEACG,那么该二叉树的前遍历结果是什么? A. ABCDEFG B. ABDFEGC C. ABDFECG D. ABDEFCG 分数 2 作者 DS课程组 单位 浙江大学 先遍历图示二叉树的结果为 A. A,B,C,D,H,E,I,F,G B. A,B,D,H,I,E,C,F,G C. H,D,I,B,E,A,F,C,G D. H,I,D,B,E,F,G,A,C 分数 3 作者 考研试卷 单位 浙江大学 已知二叉树的树形如下图所示,其后列为{ e, a, c, b, d, g, f }。树中与结点a同层的结点是: A. c B. d C. f D. g 分数 2 作者 DS课程组 单位 浙江大学 在并查集问题中,已知集合元素0~8所以对应的父结点编号值分别是{ 1, -4, 1, 1, -3, 4, 4, 8, -2 }(注:−n表示树根且对应集合大小为n),那么将元素6和8所在的集合合并(要求必须将小集合并到大集合)后,该集合对应的树根和父结点编号值分别是多少? A. 1和-6 B. 4和-5 C. 8和-5 D. 8和-6 分数 2 作者 陈越 单位 浙江大学 已知不相交集合用数组表示为{ 4, 6, 5, 2, -3, -4, 3 }。若集合元素从1到7编号,则调用Union(Find(7),Find(1))(按规模求并,并且带路径压缩)后的结果数组为: A. { 4, 6, 5, 2, 6, -7, 3 } B. { 4, 6, 5, 2, -7, 5, 3 } C. { 6, 6, 5, 6, -7, 5, 5 } D. { 6, 6, 5, 6, 6, -7, 5 } 分数 2 作者 王东 单位 贵州师范学院 引入二叉线索树的目的是( )。 A. 加快查找结点的前驱或后继的速度 B. 为了能在二叉树中方便的进行插入与删除 C. 为了能方便的找到双亲 D. 使二叉树的遍历结果唯 分数 2 作者 王东 单位 贵州师范学院 在线索二叉树中,下列说法不正确的是( )。 A. 在中线索树中,若某结点有右孩子,则其后继结点是它的右子树的最左下结点 B. 在中线索树中,若某结点有左孩子,则其前驱结点是它的左子树的最右下结点 C. 线索二叉树中是利用二叉树的n+1个空指针来存放结点的前驱和后继信息的 D. 每个结点通过线索都可以直接找到它的前驱和后继
最新发布
11-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

promise~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值