沈阳航空航天大学
课 程 设 计 报 告
课程设计名称:数据结构课程设计
课程设计题目:二叉树结点插入
院(系):计算机学院
专 业:计算机科学与技术
班 级:
学 号:
姓 名:
指导教师:
沈阳航空航天大学 |
|||||||||||||||||||||
课程设计任务书 |
|||||||||||||||||||||
课程设计名称 |
数据结构课程设计 |
专业 |
计算机科学与技术 |
||||||||||||||||||
学生姓名 |
|
班级 |
|
学号 |
|
||||||||||||||||
题目名称 |
二叉树节点插入 |
||||||||||||||||||||
起止日期 |
2017 |
年 |
12 |
月 |
25 |
日起至 |
2018 |
年 |
01 |
月 |
05 |
日止 |
|||||||||
|
|||||||||||||||||||||
课设内容和要求: |
|||||||||||||||||||||
设在一棵二叉排序树的每个结点中,含有关键字值key域和统计相同关键字值结点个数的count域,当向该树插入一个元素时,若树中已存在与该元素的关键字相同的结点,则使该结点的count域增加1,否则就由该元素生成一个新结点而插入到树中,并使其count域置为1,试按照这种插入要求编写一个算法。 要求:
5. 提交符合课程设计规范的报告。 |
|||||||||||||||||||||
参考资料: [1] 严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,2006 [2] 吕国英.算法设计与分析[M]. 北京:清华大学出版社,2006 [3] 徐宝文,李志.C程序设计语言[M].北京:机械工业出版社,2004 |
|||||||||||||||||||||
系审核意见: 系主任签字(盖章): |
|||||||||||||||||||||
指导教师(签名) |
|
|
|
年 |
|
月 |
|
日 |
|||||||||||||
学 生(签名) |
|
|
|
年 |
|
月 |
|
日 |
|||||||||||||
目 录
1 题目介绍................................................... 1
1.1 问题描述...................................................... 1
1.2 功能要求...................................................... 1
2 系统功能模块设计............................................ 3
2.1 程序结构图.................................................... 3
2.2 程序流程图.................................................... 4
3 数据结构设计................................................ 5
3.1 二叉树结点的存储结构.......................................... 5
3.2 用户输入数据的存储结构........................................ 5
4 函数与算法描述.............................................. 6
4.1 主函数中的算法................................................ 6
4.2 创建函数中的算法.............................................. 7
4.3 插入函数中的算法.............................................. 7
4.4 先序遍历函数中的算法.......................................... 9
4.5 中序遍历函数中的算法.......................................... 9
5 调试与运行结果............................................. 10
6 总结...................................................... 15
参考文献..................................................... 16
附 录 (程序源代码)........................................ 17
1 题目介绍
1.1 问题描述
设在一棵二叉排序树的每个结点中,含有关键字值key域和统计相同关键字值结点个数的count域,当向该树插入一个元素时,若树中已存在与该元素的关键字相同的结点,则使该结点的count域增加1,否则就由该元素生成一个新结点而插入到树中,并使其count域置为1.按照这种插入要求编写一个算法。
首先是使用一种二叉树的存储方式即‘二叉链表’,表示一棵二叉树,或者表示二叉树的结点,用键盘将二叉树的结点序列按照层序的顺序输入程序存入数组中,然后使用一种方法即‘二叉树的创建函数’,建成一棵真正的二叉树。插入的结点,由用户输入并存入一个变量中,并调用一种方法即‘二叉树结点插入函数’将二叉树结点插入到二叉树的,最后使用一种方法即‘二叉树的遍历函数’将创建并插入结点的二叉树按照一定的规则输出。即运用递归遍历函数对二叉树进行遍历,并输出结果。
1.2 功能要求
首先便是接收用户输入二叉树原结点与要插入结点的功能。此功能我认为
不需要特别建立函数去接受用户的输入,使用循环就可实现。原二叉树的结点使用for循环接收并存入到数组中。插入结点的接收使用一条接受输入语句就可以,然后存入到一个变量中。
接着该程序需要具备创建二叉树的功能。该功能便需要编写特定的函数去
实现。即在函数中对存储二叉树原结点关键字值的数组单元依次取值并利用二叉树插入函数插入到二叉树。
然后是将新结点插入到原二叉树的功能。我认为此功能是整个程序中最
重要的不论是创建二叉树还是将结点插入到二叉树中都需要用到。插入时首先要判断该结点是否是整棵二叉树的新结点,如果是则需要向内存申请新的存储空间,如果不是就需要与从根结点开始的结点依次进行比较。与结点进行比较时,如果插入结点比原结点小则进行新结点与原结点右子树中结点的比较,如果大则进行新结点与原结点左子树中结点的比较。大小相同则将原结点的count域增加1.
最后便是对整个二叉树进行遍历的功能。此功能包含两个函数,分别是先
序遍历函数与中序遍历函数,且两个都是用的递归的方法实现。先序遍历函数中,遍历时首先输出根结点再对根结点的左子树进行先序遍历,然后再对根结点的右子树进行先序遍历。中序遍历中,遍历时首先对根结点的左子树进行中序遍历接着便是输出根结点,最后是对根结点的右子树进行中序遍历
由于插入结点时用户的输入是单个输入,因此在主函数中用于实现接收用户输入,将新结点插入到原二叉树中并遍历二叉树并输出的代码将放入到一个while死循环中,并且会根据用户输入的数据进行判断是进行新结点的插入还是退出,这样当用户需要将多个结点插入到原二叉树中时,每次输入一个新结点后,程序执行一次while循环后便可以将该新结点插入到原二叉树中并将新形成的二叉树按照先序序列与中序序列输出。输出结果中包含每个结点的关键字key的值与count域。
2 系统功能模块设计
2.1 程序结构图
图1.程序功能结构图
创建二叉排序树部分的功能是根据用户的输入创建一棵排好序的二叉树。实现此功能的代码是二叉树创建函数。
向二叉排序树中插入结点部分的功能是根据用户输入新结点的值将新节点插入到原二叉排序树中的合适位置。实现此功能的代码是二叉树结点插入函数。
中序遍历二叉排序树部分的功能是将一棵二叉树按照中序序列输出。实现此功能的代码是中序遍历函数。
先序遍历二叉排序树部分的功能是将一棵二叉树按照先序序列输出。实现此功能的代码是先序遍历函数
用户使用键盘输入二叉树的结点部分的功能是接收用户输入的二叉树原本具有的的结点的key的值并存入到数组中。实现此功能的主要代码在主函数中。
用户使用键盘输入要插入的结点部分的功能是接收用户输入的新结点的key的值并存储到一个变量中。实现此功能的主要代码在主函数中。
2.2 程序流程图
|
|||
|
图2.主函数程序流程图
主函数运行时首先提示用户输入原二叉树的结点的key的值,并存储到数组中,接着就是调用二叉树创建函数,将数组中的所有结点创建成为一棵二叉排序树,这棵二叉排序树的存储映像是二叉链表。接着进入while循环,while循环中首先是提示用户输入新结点,接收用户输入后先判断用户输入值是否小于0,大于0时则调用二叉树结点插入函数将新结点插入到原二叉树中,并对二叉树进行先序遍历与中序遍历,接着进行下一次循环,如果用户输入值小于0则while循环结束,且整个程序结束。
3 数据结构设计
3.1 二叉树结点的存储结构
本程序中的二叉树使用二叉链表进行存储,每个结点含有4个域,关键字域key,关键字计数域count,左孩子域 *lChild ,右孩子域 *rChild。其中key与count的存储类型是正型,key存储的是该结点的值,count存储的是值与此结点相同的结点有几个,*lChild与*rChild的存储类型是结点型指针,*lChild存储的是该结点的左孩子结点的存储位置,*rChild存储的是该结点的右孩子结点的存储位置。二叉树中除叶子结点外每个结点都会指向自己的左右孩子,根结点没有父结点,其余结点都有父结点
参数传递时,一种是对结点指针的引用,一种是值传递。创建二叉树与插入新结点到二叉树中使用的参数传递方法是指针的引用,二叉树的先序与中序遍历使用的参数传递方法是值传递。
3.2 用户输入数据的存储结构
本程序中的用户输入数据使用整型数组进行存储,原二叉树结点的关键字域key使用数组进行存储。要插入二叉树中的关键字域key使用另外的数组存储。
4 函数与算法描述
4.1 主函数中的算法
主函数int main(),是整个程序的开始于结束,没有参数。所需要数据有由户输入。使用for循环接收用户输入的原二叉树的结点,并存入到一维数组中,且持续判断数组下标是否越界以及用户输入是否符合要求或者是否为0,当两者均符合要求时,用户可以持续输入原二叉树结点,当数组下标越界或者用户输入0时,接收原二叉树结点输入结束,如果用户输入输入数据小于0时,则程序结束。
for (n = 0;n < N;n++)
{
scanf_s("%d", &a[n]);//循环输入树中结点值
if (a[n] < 0)
{ printf("所输入值不符合要求:\n"); exit(-1); }
else if (a[n] == 0)
{ getchar(); break; }
getchar();//接收空格
}
主函数插入结点的输入使用while循环输入,当用户每输入一个合法值后便进行插入操作与遍历操作,然后进行下一次while循环,当用户输入值小于0时则退出while循环,结束结点插入,程序结束。
while (1)
{
printf("请输入插入二叉树的关键字值\n");
printf("输入的值小于 0 时退出程序\n");
scanf_s("%d", &b);
if (b < 0) break;
BSTInsert(T, b);//将新结点插入原二叉树中
printf("二叉排序树插入结点后\n");
printf("先序遍历结果如下:\n");
preOrderTraverse(T);
printf("中序遍历结果如下:\n");
inOrderTraverse(T);
printf("\n");
}
4.2 创建函数中的算法
二叉树创建函数void createBST(Node * &T, int a[], int n),函数的参数是新建二叉树根结点指针的地址,存储原二叉树结点信息的数组,以及数组中有效结点的个数。此函数可以根据用户输入并调用二叉树结点插入函数创建一棵二叉排序树。
void createBST(Node * &T, int a[], int n)// 建立BST
{
T = NULL;
for (int i = 0; i < n; i++)
{ BSTInsert(T, a[i]);//循环插入结点构建二叉排序树 }
}
4.3 插入函数中的算法
二叉树结点插入函数bool BSTInsert(Node * &p, int element),函数的参数是二叉树根结点指针的地址,与要插入二叉树中的结点关键字key的值。二叉树结点插入函数进行结点插入时,首先判断原二叉树是否为空,如果为空,则申请空间,将该结点的key域赋值,将count域增1,且使其左右孩子都指向空;如果不为空,则判断新节点是否已存在于原二叉树中,如果存在,则只将已存在结点的count域增1,如果不存在;则将新结点的key域与树的根节点的key域进行比较,如果新结点较小,则递归调用函数自己,将新结点插入到根结点的左子树中,如果新结点较大,则递归调用函数自己,将新结点插入到根结点的右子树中。
bool BSTInsert(Node * &p, int element)// 插入结点,数据域为element
{ //‘Node * &p’是‘Node *’类型的一个引用类型。
//&表示引用类型,传参数时直接对原数操作,不是先复制再操作
if (NULL == p) // 空树
{
p = new Node;//申请新的存储空间//C++中的申请内存的运算符
p->key = element;//给新结点赋值
p->count++;//结点个数增1
p->lChild = p->rChild = NULL;//新增结点的左右子树均为空
return true;
}
else if (element == p->key) // BST中有相等的值时结点个数增1
{
p->count++;
return false;
}
else if (element < p->key) // 新插入结点值小于父结点值,递归插入
return BSTInsert(p->lChild, element);
else
return BSTInsert(p->rChild, element); // 新结点值大于父结点值,递归
}
4.4 先序遍历函数中的算法
二叉树先序遍历函数void preOrderTraverse(BST T),函数的参数是二叉树。首先输出根结点,再递归调用函数本身,先序遍历根结点的左子树,然后递归调用函数本身,先序遍历根结点的右子树。
void preOrderTraverse(BST T)// 先序遍历
{
if (T)
{
printf("key=%d,count=%d\n", T->key, T->count);//结点值与个数
preOrderTraverse(T->lChild);//递归遍历左子树
preOrderTraverse(T->rChild);//递归遍历右子树
}
}
4.5 中序遍历函数中的算法
二叉树中序遍历函数void inOrderTraverse(BST T),函数的参数是二叉树首先递归调用函数本身,中序遍历根结点的左子树,再输出根结点,然后递归调用函数本身,中序遍历根结点的右子树。
void inOrderTraverse(BST T)// 中序遍历
{
if (T)
{
inOrderTraverse(T->lChild);//递归遍历左子树
printf("域key=%d,域count=%d\n", T->key, T->count);//结点个数
inOrderTraverse(T->rChild);//递归遍历右子树
}
}
5 调试与运行结果
本程序的运行与调试环境为Visual Studio 2015 Community。保存格式为”.cpp”文件。
简单例子运行过程:
运行程序时首先申请一些变量的内存空间,然后提示输入原二叉树的结点key值“100 80 110”,并以0结束,接着由程序将0前面的数值存放到数组a[N]的0-2号单元内。即a[0]=100,a[1]=80,a[2]=110.然后初始化指向一棵二叉树的空指针T,接着将指针T的地址,数组a[N]的地址,与a[N]中有效数值单元的个数n即3作为参数传递给二叉树创建函数createBST(T,a,n),由此函数创建一棵二叉排序树。二叉树创建二叉排序树T时,依次从数组中取出有效的结点key值,并将T指针的地址与数组中a[i]的有效值作为参数,调用函数BSTInsert(T,a[i])依次将结点插入到二叉树中。
函数BSTInsert(T,a[i])插入结点a[0]时首先判断T指针是否指向NULL,为空则申请一个新的结点空间并将结点的key域赋值为a[0],count域赋值为1,左右指针lChild,rChild均指向NULL; 插入结点a[1]时首先判断T指针是否指向NULL,不为空,则判断a[1]的值与T的key即80与100的大小,a[1]小于T的key域,则调用函数本身向自己的左子树中插入新结点即:BSTInsert(T->lChild, a[i]),此时T-lChild指针指向NULL,为空则申请一个新的结点空间并将结点的key域赋值为a[1],count域赋值为1,左右指针lChild,rChild均指向NULL; 插入结点a[2]时首先判断T指针是否指向NULL,不为空,则判断a[2]的值与T的key即110与100的大小,大于,则调用函数本身向自己的右子树中插入新结点即:BSTInsert(T->rChild, a[i]),此时T-rChild指针指向NULL,为空则申请一个新的结点空间并将结点的key域赋值为a[2],count域赋值为1,左右指针lChild,rChild均指向NULL.此时二叉树创建完成。
然后调用函数inOrderTraverse(T)对原二叉树进行中序遍历,遍历时首先中序遍历原二叉树的左子树即中序遍历T->lChild,不为空则进行中序遍历。对二叉树T->lChild进行中序遍历,遍历时首先中序遍历原二叉树的左子树即中序遍历T->lChild->lChild,为空,则访问根结点即输出结点T->lChild的key值即80,接着中序遍历二叉树的左子树即中序遍历T->lChild->rChild,为空,则原二叉树T的左子树中序遍历完毕。然后访问根结点即输出输出结点T的key值即100。最后对二叉树T->rChild进行中序遍历,遍历时首先中序遍历二叉树T->rChild的右子树即中序遍历T->rChild->lChild,为空则为空,则访问根结点即输出结点T->rChild的key值即110,接着中序遍历二叉树的左子树即中序遍历T->rChild->rChild,为空,则原二叉树T的右子树中序遍历完毕。
接着进入while循环。用户根据提示输入要插入的结点的key值即99,并存储到变量b中,判断b的值如果b小于0,则退出while循环,程序结束,b不小于0则进行结点插入。因为b值为99,不小于0因此进行结点插入,然后调用函数BSTInsert(T,b),将新结点插入到原二叉树中,插入结点b时首先判断T指针是否指向NULL,不为空,则判断b的值与T的key即99与100的大小,b小于T的key域,则调用函数本身向自己的左子树中插入新结点即:BSTInsert(T->lChild, b),接着判断T指针是否指向NULL,不为空,则判断b的值与T的key即99与80的大小,大于,则调用函数本身向自己的右子树中插入新结点即:BSTInsert(T->lChild->rChild, b),此时T->lChild->rChild指针指向NULL,为空则申请一个新的结点空间并将结点的key域赋值为b,count域赋值为1,左右指针lChild,rChild均指向NULL.此时新结点99插入完成。
然后调用函数preOrderTraverse(T)对二叉树进行先序遍历,遍历时首先访问根结点即输出输出结点T的key值即100,,然后中先遍历原二叉树的左子树即先序遍历T->lChild,不为空则进行先序遍历。对二叉树T->lChild进行先序遍历,访问根结点即输出结点T->lChild的key值即80,先序遍历二叉树的左子树即先序遍历T->lChild->lChild,为空,则接着先序遍历二叉树的右子树即先序遍历T->lChild->rChild,访问根结点即输出结点T->lChild->rChild的key值即99,先序遍历二叉树的左子树即先序遍历T->lChild->rChild->lChild,为空,先序遍历二叉树的右子树即先序遍历T->lChild->rChild->rChild,为空,则原二叉树T的左子树先序遍历完毕。最后对二叉树T->rChild进行先序遍历,遍历时首先先序遍历二叉树T->rChild的右子树即先序遍历T->rChild->lChild,访问根结点即输出结点T->rChild->lChild的key值即110,,先序遍历二叉树的左子树即先序遍历T->rChild->lChild->lChild,为空,先序遍历二叉树的右子树即先序遍历T->rChild->lChild->rChild,为空,则原二叉树T的左子树先序遍历完毕.
然后调用函数inOrderTraverse(T)对二叉树进行中序遍历。过程与前者类似。
接着用户输入小于0的数,退出while循环,程序结束。
过程与结果如图3.
图3.简单实例运行过程
复杂实例运行过程:
首先输入原二叉树中结点的关键字值,输入数据100,80,110,60,90,105,115,100,80,110,90,110.到程序中,0作为结束标志,由于这些数据中有些结点关键字值key重复,所以创建二叉树时,关键字值重复的结点只创建一个,而结点个数域count则会增加1。中序遍历原二叉排序树就是有序的结点顺序。程序执行结果如图4.
图4.二叉树的结点与二叉树的中序遍历
接着将key值为80的结点插入到之前已经形成的二叉排序树中,并对插入后的树进行先序遍历与中序遍历。由于原二叉树中已经含有key值为80的结点,所以插入时,不会产生新的结点,只会将原key值为80的结点的count域增1。程序执行结果如图5.
图5.插入key为80的结点并进行遍历
然后将key值为0的结点插入到之前已经形成的二叉排序树中,并对插入后的树进行先序遍历与中序遍历。由于原二叉树中没有key值为0的结点,所以插入时,会产生新的结点,且key值为0的结点的count域变为1。程序执行结果如图6.
图6.插入key为0的结点并进行遍历
最后根据程序所给的提示,输入符合程序要求的结束程序运行的的数值,使程序结束运行。程序执行结果如图7.
图7.输入小于0的数以结束程序
6 总结
本学期学期重修数据结构课程,让我掌握了计算机程序的构造,执行等过程。
在C语言中程序除了具有一些基本的整型,字符型,浮点型等类型之外,更重要的是编程人员自定义的类型,而这类自定义类型对于程序来说就是基石,只有在自定义类型的基础上C语言程序才能应用到更加广泛的范围。本学期的重修使我从本质上理解了众多计算机程序的根本是算法,没有算法的计算机程序犹如没有灵魂的肉体。而算法的又与数据结构是密不可分的,C语言的的数据结构有四个大类,分别是线性结构,树,图,集合。这四种数据结构最简单的便是线性结构例如链表、队列、栈等,线性结构的应用也比较广泛比如回文字符串的判断。树这种结构也包含多种比如二叉树、哈夫曼树等,树的应用有哈夫曼编码等。图这种结构包含有无向图,有向图,循环图,应用也比较广泛,比如最短路径,拓扑排序等。集合这种结构的应用有查找与排序等。每种结构及其应用都是非常重要的。
而此次课程设计使用的是树结构,树是一种一对多的数据结构,每个父结点都有可能包含多于一个的子结点,这种情况下如果想要使树的结构清晰的表达出来就需要使用具有指向作用的指针了,而树的存储结构映射到计算机中,又需要使用另外的结构,例如链表,因此树的存储结构就有多种,例如双亲表示法,孩子表示法,孩子兄弟表示法等,而作为树的升级森林的表示相对而言理解的难度虽有所上升,但是表示方法却大同小异。而与树相关比较紧密的便是树的遍历,而遍历的方法也有多种比如先序遍历,中序遍历,后序遍历,层序遍历。每种遍历方法既包含递归的方式,又包含非递归的方法。
在此次课程设计中我所使用的存储结构是二叉链表。遍历方法采用的是递归先序遍历与递归中序遍历,因为先序遍历与中序遍历结合起来使用就可以唯一的确定一棵树,本次课程设计从初步构思到一步步完善直到最后完成整个课程设计,让我更好的巩固了自己所学的知识。翻阅图书去学习一些没有接触过的知识让我更好的了解了这门课程,增强的实践动手能力。总的来说,虽然完成了老师安排的任务,但是还没有达到尽善尽美的地步,还有很多要学习,要实践。
参考文献
[1] 严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,2006
[2] 吕国英.算法设计与分析[M]. 北京:清华大学出版社,2006
[3] 徐宝文,李志.C程序设计语言[M].北京:机械工业出版社,2004
[4] 郑莉,董渊,何江舟.C++语言程序设计[M]. 北京:清华大学出版社,2010
[5] 刘振鹏,张晓莉,郝杰.数据结构[T].北京:中国铁道出版社,2003
[6] 李春葆.数据结构习题与解析(C语言篇)[M].北京:清华大学出版社,2000
[7] 谭浩强.C程序设计(第三版)[M].北京:清华大学出版社,2005
[8] 吴文虎.程序设计基础(第二版)[M].北京:清华大学出版社,2004
[9] 苏小红等. C语言大学实用教程(第2版)[M].北京:电子工业出版社,2008
[10] 杨开城,张志坤.C语言程序设计教程、实验与练习[M].北京:人民邮电出版社,2002
[11] (美)Herbert Schildt 著.C语言大全(第四版).王子恢,戴健鹏等译.北京:电子工业出版社,2001
[12] (美)Deitel H M,Deitel P J 著. C程序设计教程.薛万鹏等译.北京:机械工业出版社,2000
[13] (美)Horton,I.著.C语言入门经典(第5版).杨浩译.北京:清华大学出版社,2013
附
录
(程序源代码)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define N 60
typedef struct node //使用二叉链表存储表示一棵二叉树
{
int key, count = 0;
struct node *lChild, *rChild;
}Node, *BST;
bool BSTInsert(Node * &p, int element)// 在树BST中插入结点,数据域为element
{
if (NULL == p) // 空树
{
p = new Node;//申请新的存储空间
p->key = element;//给新结点赋值
p->count++;//结点个数增1
p->lChild = p->rChild = NULL;//新结点的左右子树均为空
return true;
}
else if (element == p->key) // 树中有相等的值时结点个数增1
{
p->count++;
return false;
}
else if (element < p->key) // 新结点值小于父结点值,递归左插入
return BSTInsert(p->lChild, element);
else
return BSTInsert(p->rChild, element); // 大于,递归右插入
}
void createBST(Node * &T, int a[], int n)// 建立BST
{
T = NULL;
for (int i = 0; i < n; i++)
{
BSTInsert(T, a[i]);//循环插入结点构建二叉排序树
}
}
void preOrderTraverse(BST T)// 先序遍历
{
if (T)
{
printf("key=%d,count=%d\n", T->key, T->count);//结点值与个数
preOrderTraverse(T->lChild);//递归遍历左子树
preOrderTraverse(T->rChild);//递归遍历右子树
}
}
void inOrderTraverse(BST T)// 中序遍历
{
if (T)
{
inOrderTraverse(T->lChild);//递归遍历左子树
printf("域key=%d,域count=%d\n", T->key, T->count);//结点个数
inOrderTraverse(T->rChild);//递归遍历右子树
}
}
int main()
{
int a[N],b, n = 0;
printf("请按层序遍历输入二叉树关键字值(少于%d个,整型且大于0),并以0结束:\n", N);
for (n = 0;n < N;n++)
{
scanf_s("%d", &a[n]);//循环输入树中结点值
if (a[n] < 0)
{
printf("所输入值不符合要求:\n");
exit(-1);
}
else if (a[n] == 0)
{
getchar(); //接收空格
break;
}
getchar();//接收空格
}
BST T;
createBST(T, a, n);
printf("中序遍历原二叉排序树结果如下:\n");
inOrderTraverse(T);
printf("\n");
//单个数值插入可以无限循环
while (1)
{
printf("请输入插入二叉树的关键字值\n");
printf("输入的值小于 0 时退出程序\n");
scanf_s("%d", &b);
if (b < 0)
break;
BSTInsert(T, b);//将新结点插入原二叉树中
printf("二叉排序树插入结点后\n");
printf("先序遍历结果如下:\n");
preOrderTraverse(T);
printf("中序遍历结果如下:\n");
inOrderTraverse(T);
printf("\n");
}
system("pause");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!