1本程序在vc++6.0编译通过并能正常运行。
2主界面程序已经尽量做到操作简便了,用户只需要根据提示一步步进行操作就行了。
六思考和总结:这个课程设计的各个基本操作大部分都在我的综合性实验中实现了,所以做这个主要攻克插入和删除这两个算法!其中插入在书本上已经有了,其中的右平衡算法虽然没有给出,但通过给出的左平衡算法很容易就可以写出右平衡算法。
所以最终的点就在于删除算法的实现!做的过程中对插入算法进行了非常非常多次的尝试!花了非常多的时间,这其中很多时候是在对程序进行单步调试,运用了VC6。
0的众多良好工具,也学到了很多它的许多好的调试手段。
其中删除算法中最难想到的一点是:在用叶子结点代替要删除的非叶子结点后,应该递归的运用删除算法去删除叶子结点!这就是整个算法的核心,其中很强烈得体会到的递归的强大,递归的最高境界(我暂时能看到的境界)!其它的都没什么了。
选做的那两个算法很容易实现的:1合并两棵平衡二叉排序树:只需遍历其中的一棵,将它的每一个元素插入到另一棵即可。
2拆分两棵平衡二叉排序树:只需以根结点为中心,左子树独立为一棵,右子树独立为一棵,最后将根插入到左子树或右子树即可。
BSTreeEmpty(BSTreeT)初始条件:平衡二叉排序树存在。
操作结果:若T为空平衡二叉排序树,则返回TRUE,否则FALSE.BSTreeDepth(BSTreeT)初始条件:平衡二叉排序树存在。
操作结果:返回T的深度。
LeafNum(BSTreeT)求叶子结点数,非递归中序遍历NodeNum(BSTreeT)求结点数,非递归中序遍历DestoryBSTree(BSTree*T)后序遍历销毁平衡二叉排序树TR_Rotate(BSTree*p)对以*p为根的平衡二叉排序树作右旋处理,处理之后p指向新的树根结点即旋转处理之前的左子树的根结点L_Rotate(BSTree*p)对以*p为根的平衡二叉排序树作左旋处理,处理之后p指向新的树根结点,即旋转处理之前的右子树的根结点LeftBalance(BSTree*T)对以指针T所指结点为根的平衡二叉排序树作左平衡旋转处理,本算法结束时,指针T指向新的根结点RightBalance(BSTree*T)对以指针T所指结点为根的平衡二叉排序树作右平衡旋转处理,本算法结束时,指针T指向新的根结点Insert_AVL(BSTree*T,TElemTypee,int*taller)若在平衡的二叉排序树T中不存在和e有相同的关键字的结点,则插入一个数据元素为e的新结点,并返回OK,否则返回ERROR.若因插入而使二叉排序树失去平衡,则作平衡旋转处理布尔变量taller反映T长高与否InOrderTraverse(BSTreeT)递归中序遍历输出平衡二叉排序树SearchBST(BSTreeT,TElemTypee,BSTree*f,BSTree*p)在根指针T所指的平衡二叉排序树中递归的查找其元素值等于e的数据元素,若查找成功,则指针p指向该数据元素结点,并返回TRUE,否则指针p指向查找路径上访问的最后一个结点并返回FALSE,指针f指向T的双亲,其初始调用值为NULLDelete_AVL(BSTree*T,TElemTypee,int*shorter)在平衡二叉排序树中删除元素值为e的结点,成功返回OK,失败返回ERRORPrintBSTree_GList(BSTreeT)以广义表形式打印出来PrintBSTree_AoList(BSTreeT,intlength)以凹入表形式打印,length初始值为0Combine_Two_AVL(BSTree*T1,BSTreeT2)合并两棵平衡二叉排序树Split_AVL(BSTreeT,BSTree*T1,BSTree*T2)拆分两棵平衡二叉树}(2)存储结构的定义:typedefstructBSTNode{ TElemTypedata; intbf;//结点的平衡因子 structBSTNode*lchild,*rchild;//左.右孩子指针}BSTNode,*BSTree;
1
数据结构小代码,改自《数据结构与算法分析C++版》源代码1.编写使用freelist的带头、尾结点的双向链表类的定义,实现双向链表的基本操作。
2.利用双向链表实现2个一元稀疏多项式的加法运算,运算结果得到的链表要求按照指数升序有序,并遍历输出指数升序、指数降序的多项式。
2024/6/12 2:41:24 1.19MB datastructur
1
数塔问题:设有一个三角形数塔(如下图所示),求自塔顶至塔底的一条路径,使得该路径上结点的值的总和最大。
设计动态规划算法,并分析时间复杂性,C程序求自塔顶至塔底的一条路径,使得该路径上结点的值的总和最大。
设计动态规划算法
1
很多涉及图上操作的算法都是以图的遍历操作为基础的。
试写一个程序,演示无向图的遍历操作。
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。
[测试数据]由学生依据软件工程的测试技术自己确定。
注意测试边界数据,如单个结点。
[实现提示]设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。
通过输入图的全部边输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制。
注意,生成树的边是有向边,端点顺序不能颠倒。
2024/5/26 13:25:36 120KB BFS DFS
1
用带表头的链表存放输入的数据,每读入一个数,按升序顺序插入到链表中,链表中允许两个结点有相同值。
链表的头结点存放链表后面的结点个数,初始化时就生成头结点(初值为0)。
链表翻转是把数据逆序(变成降序),注意,头结点不动。
翻转后要再翻转一次,恢复升序后才能插入新元素,否则会出错。
2024/5/24 22:27:56 43KB 链表
1
霍夫曼编码,对输入的字符集和各个字符对应的权值,例如A={a,b,c,d,e,f,g,h},各个字符对应的权值为{5,29,7,8,14,23,3,11},求出每个字符的霍夫曼编码。
【输入形式】输入若干个字符(1<=n<=26),其权值为int型。
输入数据的第一行的整数n,表示字符数;
接下来的n行是字符集,一行一个字符;
最后一行是各字符的权值,以空格分隔。
【输出形式】每个字符(节点)的霍夫曼编码。
参见样例输出。
【样例输入】4abcd13722【样例输出】a:000b:001c:01  d:1【样例说明】提示:1、将最小两个子树合并过程中一定要从前向后去查找两个最小子树,最小子树作为新结点的左子树,次小子树作为新结点的右子树,编码过程中左子树定义为0,右子树定义为12、另外:一般原则要求: 若有重复权值结点,原来森林中的结点优先选择(即深度小的结点优先,以确保最终总树深较浅并相对平衡)。
新生成的权值和的结点后用。
2024/3/30 12:22:16 4KB 二又树应用 霍夫曼编码
1
使用sparkgraphx实现网络结点n度关系计算
2024/3/27 7:01:01 6KB spark graphx 图计算
1
算法中将一条线视为一个结点,采用广度优先搜索,利用树结构存储搜索结果,算法效率高,在武汉地铁11条线路190余个站点的线网图中测试,任意两点间的所有路径平均耗时0.2秒。
只要对算法中的费用矩阵做调整,即可适用于公交等其他网络。
2024/3/26 14:48:14 700KB 所有路径 算法 高效 地铁
1
C++信号放大器(1)运用二叉树的定义将左孩子、右孩子、结点值、权值即与父结点的衰减量、以及当前结点的最大衰减量联系起来。
(2)设置信号放大器函数该函数主要实现判断是否超过容忍值并在合适位置放置信号放大器使其数量最少。
首先将当前结点最大衰减量D初始化,当只有右子树时即左子树为空,计算出当前结点的最大衰减量,判断当超过容忍值时则放置信号放大器并输出;
当只有左子树时即右子树为空,计算出当前结点的最大衰减量,判断当超过容忍值时则放置信号放大器并输出;
当左右子树都存在并左子树的衰减量大于右子树时则计算当前结点最大衰减量D并判断是否超过容忍值并输出,继续进一步比较其右子树的当前最大衰减量与右子树的衰减量之和和其左子树的衰减量,若大于则更新D,并判断是否超过容忍值并输出,再进一步比较其右子树的衰减量与其左子树的衰减量,若大于则再更新D;
当左右子树都存在且右子树的衰减量大于左子树时,比较方法与前者相似,颠倒左右即可。
通过此算法可将放置的放大器数目最少。
(3)主函数主函数中包括输入信息时的声明及相关函数的调用。
四调试分析该程序在设置信号放大器的比较算法上有些麻烦,需要进行很多比较。
结点信息的输入也比较麻烦,很浪费时间,还有就是输出结果时最好将二叉树的具体结构一同输出便于检查,并且形象直观。
1
假设以如下说明的三元组(F、C、L/R)序列输入一棵二叉树的诸边(其中F表示双亲结点的标识,C表示孩子结点标识,L/R表示C为F的左孩子或右孩子),且在输入的三元组序列中,C是按层次顺序出现的。
设结点的标识是字符类型。
F=‘^’时C为根结点标识,若C亦为‘^’,则表示输入结束。
试编写算法,由输入的三元组序列建立二叉树的二叉链表,并以中序序列输出。
^ALABLACRBDLCELCFRDGRFHL^^L
2024/3/17 10:31:56 199KB 二叉树 先序 中序 遍历
1
共 150 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡