一、课程设计题目
二叉平衡排序树
摘要 问题描述:从一棵空树开始创建,在创建过程中,保证树的有序性,同时还要针对树的平衡性做些调整。最终要把创建好的二叉排序树转换为二叉平衡排序树。
?? 基本要求:1.创建(插入、调整、改组)
2.输出
开发工具:windows XP操作系统,Microsoft visual c++ 6.0 编译系统;
关键词:C++ ;
二、设计主要目的及意义
目的:
1.熟悉掌握二叉树的基本操作
2.熟悉二叉树的创建(插入、调整、改组),输出以及把二叉排序树转换为二
叉平衡排序树
更进一步掌握有关二叉排序树的操作
意义:
软件课程设计是计算机专业一学生面向对象的编程设计思想新一代程序设计逻辑思维方式提高在软件设计过程中分析问题和解决问题的实际动手能力,使的理论知识和实践技能得到共同发展动态平衡技术Adelson-Velskii 和 Landis 提出了一个动态地保持二叉排序树平衡的方法,其基本思想是:在构造二叉排序树的过程中,每当插入一个结点时,首先检查是否因插入而破坏了树的平衡性,如果是因插入结点而破坏了树的平衡性,则找出其中最小不平衡子树,在保持排序树特性的前提下,调整最小不平衡子树中各结点之间的连接关系,以达到新的平衡。通常将这样得到的平衡二叉排序树简称为 AVL 树。为了保证二叉排序树的高度为lgn,从而保证二叉排序树上实现的插入、删除和查找等基本操作的平均时间为O(lgn),在往树中插入或删除结点时,要调整树的形态来保持树的平衡。使之既保持BST性质不变又保证树的高度在任何情况下均为O(lgn),从而确保树上的基本操作在最坏情况下的时间均为O(lgn)。
最小不平衡子树以离插入结点最近、且平衡因子绝对值大于 1 的结点作根结点的子树。为了简化讨论,不妨假设二叉排序树的最小不平衡子树的根结点为 A ,则调整该子树的规律可归纳为下列四种情况:
图平衡调整的4种基本类型(结点旁的数字是平衡因子)(1) LL 型:新结点 X 插在 A 的左孩子的左子树里。调整方法见图。图中以 B 为轴心,将 A 结点从 B 的右上方转到 B 的右下侧,使 A 成为 B 的右孩子。(2)RR 型:新结点 X 插在 A 的右孩子的右子树里。调整方法见图 (b) 。图中以 B 为轴心,将 A 结点从 B 的左上方转到 B 的左下侧,使 A 成为 B 的左孩子。(3)LR 型: 新结点 X 插在 A 的左孩子的右子树里。调整方法见图 (c) 。分为两步进行:第一步以 X 为轴心,将 B 从 X 的左上方转到 X 的左下侧,使 B 成为 X 的左孩子, X 成为 A 的左孩子。第二步跟 LL 型一样处理 ( 应以 X 为轴心 ) 。(4)RL 型: 新结点 X 插在 A 的右孩子的左子树里。调整方法见图(d) 。分为两步进行:第一步以 X 为轴心,将 B 从 X 的右上方转到 X 的右下侧,使 B 成为 X 的右孩子, X 成为 A 的右孩子。第二步跟 RR 型一样处理 ( 应以 X 为轴心 ) 。(代码部分详见附录)
运行界面
运行界面如下图所示:
【注:运行时所执行的操作标注在截图的上方】
选择1,输入序列(13,24,37,90,53)创建一刻二叉平衡树,以0为结尾;
序列输入完成以后按回车,再选择4,中序输出该树;
继续其它操作,选择2,插入一个新结点,其值为1,插入后选择4中序输出该树;
继续其它操作,选择3删除一个结点,这里删除结点1,删除后先序输出该树;
继续其它操作,输入6,6不是1-5中的树,程序自动退出;
注:程序存在已知缺陷(结点删除后的平衡问体,某种状态下删除特殊位置的结点会出现异常),有待弥补。
重点及难点
重点:
任一结点的左右子树的高度均相同(如满二叉树),则二叉树是完全平衡的。通常,只要二叉树的高度为O(1gn),就可看作是平衡的。平衡的二叉排序树指满足BST性质的平衡二叉树。AVL树中任一结点的左、右子树的高度之差的绝对值不超过1。在最坏情况下,n个结点的AVL树的高度约为1.44lgn。而完全平衡的二叉树度高约为lgn,AVL树是接近最优的。想起了软工老师的一句话:"难事破与易",复杂的事,拆成一个个简单的小部分,逐个击破,在拼凑起来,复杂的事也变的简单了本是在直接指导下完成的,在在百忙中挤出时间多次给予指导出了许多贵的修改意见。在此也向他们表示由衷的感谢。[1] 王春红,梁普选,王建亮. Delphi程序开发. 北京:机械工业出版社 2003
[2] 张基温,杨晓玲. Visual Basic程序开发教程.北京:清华大学出版2004
[3] 陈俊源. Delphi程序设计实用教程. 北京:电子