二叉树的应用

一、实验目的
掌握树形结构的特点,二叉树的存储方式以及相应操作。
二、实验内容
1、根据输入的数据建立一个二叉树。
2、输出二叉树(输出的结果应为树型结构)。
3、输出其前序、中序和后序遍历的结果。
4、输出树的深度,最大元,最小元。
三、实验要求
1、用链表实现。
四.解题总结
1.看图说话,咱们先来看看结果,相当于测试用例。
在这里插入图片描述
这道实验题的关键点之一也是重点之一就是如何成功地创建一个二叉树的结构?
这里参考这位大佬的博客https://blog.csdn.net/weixin_36372879/article/details/77776500
其实刚开始我也是这么像这样建立二叉树的,但是在写完之后调试出现了错误,按理来讲这样建立二叉树的结构从逻辑上来讲是没有问题的,大致思路是这样:先输出一个字符,#代表空,但如果不为空,则申请内存空间创建一新的结点,数据域赋值ch,接下来分别递归调用左子树创建函数和右子树创建函数,依次类推,最后创建完毕。后来在我己经修改之后终于能运行了,但是却一直在创建二叉树跳不出来。最后我换了另外的写法:

BiTree CreateTree() {
    char ch;
    BiTree T;
    scanf_s("%c", &ch);
    if (ch == '#')  T = NULL;
    else {
        T = (BiTree)malloc(sizeof(BiTNode));
        T->data = ch;
        T->lchild = CreateTree();
        T->rchild = CreateTree();
    };
    return T;
  

最终没出现问题,至于上述两周写法的区别和为什么第一种出现错误,我到现在也没想明白,还需继续琢磨。
2.字符和整型数字的转换:
在求树的最大元和最小元时,如何将输入的字符数字转换成整型数字?
把ch-‘0’,也就是数字字符减去0的ASCII码即可得到数字字符所对应的整型数字。如图:

int GetMax(BiTree T) {
    static int max = 0;
    if (T != NULL) {
        if (max < (T->data-'0'))  max = T->data-'0';
        GetMax(T->lchild);
        GetMax(T->rchild);
    }
    return max;
}
int GetMin(BiTree T){
     static int  min = 999;
    if (T != NULL) {
        if ((T->data-'0') < min)  min = T->data-'0';
        GetMin(T->lchild);
        GetMin(T->rchild);
    }
    return min;
}

这里有一个小提示,min的取值不要超出int的所能表示的范围.
3.静态变量static int 和int的区别:
上面的代码如果把static去掉就会出现逻辑错误。为什么?
静态变量static不是const常量,并不是不变的,在这里我们想要实现的是,刚开始定义min和max,然后递归调用依次比较更新,也就是说我们只需要初始化一次。而static int 和int的区别在于,static int只初始化一次,随后的调用不进行初始化跟着程序走是多少就是多少,但是int不一样,每次调用都会进行初始化,所以每次递归调用我上次比较完的信息经过初始化之后就消失了,最终导致出现逻辑错误。
4.既然创建二叉树,在输入数据时,怎样才算输入结束呢?
只有在二叉树的叶子结点左右指针域都填空,成为一棵完整的二叉树的结构时,才算输入结束。如图:

在这里插入图片描述

最后,分享出关于二叉树的应用的代码完整链接
链接:https://pan.baidu.com/s/1hGegmu_aHkIA1vOkFWcF4Q
提取码:91b7

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值