一、实验目的
掌握树形结构的特点,二叉树的存储方式以及相应操作。
二、实验内容
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