7-2 线索二叉树的建立和遍历 (PTA-数据结构)

本题要求实现对建立中序线索二叉树和中序遍历中序线索二叉树。

图片1.png

输入格式:

输入为先序序列

输出格式:

输出为中序遍历线索树的结点值以及结点的左右指针信息。

输入样例:

在这里给出一组输入。例如:

AB@D@@CE@@@

输出样例:

B  1  0
D  1  1
A  0  0
E  1  1
C  0  1

 提交结果:


思路分析:

        此题乍一看,存在一点难度,实则看过我之前发的关于树的内容的推文的同学,已经知道了怎么写,运用先序创建树(来自《数据结构 树、二叉树(前半) 学习心得代码》),创建中序线索二叉树,线索中序遍历(来自《数据结构 二叉树(后半)、线索二叉树 学习心得代码》),此三个函数轻松复制,轻松求解(半路感觉不靠谱还可以用先序遍历树的算法测试一下先序创建树所创建的树是否符合要求,便于后面两个算法进行操作),具体算法内容以及介绍可移步上面两个推文,下面将对题意输入进行简单的分析,以便补充“先序创建树”内容。

        输入是 “AB@D@@CE@@@” ,其中的@便是代表NULL空节点,所以创建树函数当检测到@符号时,将直接“return NULL;”,然后根据已知是先序序列,不难得到树的结构。下图给出了此输入应当得到的树:(红色位置即为@的作用,意即此处无结点)


代码展示: 

//
// Created by DDD on 2023/12/2.
//
#include <stdio.h>
#include <malloc.h>

typedef struct Node{
    char data;
    struct Node *lchild, *rchild;
    int ltag,rtag;
}BiTree, Node;

void InOrderThread(BiTree *root){     //线索中序遍历
    BiTree *p = root;
    while(p->ltag != 1)
        p = p->lchild;
    while(p){
        printf("%c  %d  %d\n",p->data,p->ltag,p->rtag);
        if(p->rtag == 1)
            p = p->rchild;
        else{
            p = p->rchild;
            while(p->ltag != 1)
                p=p->lchild;
        }
    }
}

BiTree *pre = NULL;
void InThreaded(BiTree *root) {        //中序线索树创建
    if (root) {
        InThreaded(root->lchild);
        if (root->lchild == NULL)
            root->ltag = 1;
        else root->ltag = 0;
        if (root->rchild == NULL)
            root->rtag = 1;
        else root->rtag = 0;
        if (pre != NULL) {
            if (pre->rtag == 1)
                pre->rchild = root;
            if (pre->ltag == 1)
                pre->lchild = root;
        }
        pre = root;
        InThreaded(root->rchild);
    }
}


BiTree *PreCreateTree(){       //先序输入
    BiTree *T;
    char ch;
    scanf("%c",&ch);
    if(ch == '@')
        return NULL;
    else {
        T = (BiTree *) malloc(sizeof (BiTree));
        T->data = ch;
        T->lchild = PreCreateTree();
        T->rchild = PreCreateTree();
    }
    return T;
}

int main(){
    BiTree Tree = *PreCreateTree();
    InThreaded(&Tree);
    InOrderThread(&Tree);
}

好久没更新,水一个博文

这些固定的算法一定要记好!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值