当前位置:文档之家› 计算机科学与技术课程设计

计算机科学与技术课程设计

一、课程设计题目二叉平衡排序树摘要问题描述:从一棵空树开始创建,在创建过程中,保证树的有序性,同时还要针对树的平衡性做些调整。

最终要把创建好的二叉排序树转换为二叉平衡排序树。

基本要求:1.创建(插入、调整、改组)2.输出开发工具:windows XP操作系统,Microsoft visual c++ 6.0 编译系统;关键词:C++ ;二、设计主要目的及意义目的:1.熟悉掌握二叉树的基本操作2.熟悉二叉树的创建(插入、调整、改组),输出以及把二叉排序树转换为二叉平衡排序树3.更进一步掌握有关二叉排序树的操作意义:软件课程设计是计算机科学与技术专业软件方向的一个重要环节,是语言类课程学习的总结。

通过课程设计使我们加深对程序设计的理解,掌握程序开发的基本方法,深化学生面向对象的编程设计思想和新一代程序设计的逻辑思维方式,把课堂上所学到的多个单元串到一起,提高我们在软件设计过程中分析问题和解决问题的实际动手能力,使我们的理论知识和实践技能得到共同发展,最终提高我们解决问题和分析问题的能力。

为我们踏上工作岗位之前提供了一次专业研究和项目开发的宝贵实践机会,为今后的工作积累经验。

三、课程设计的过程主要算法说明:1.主要数据结构定义typedef struct node node ;Struct node{Node*parent;Node*left;Node*right;Int balance;//左右子树高度之差Int key;}2.主要函数说明Int scarchNode(int key, node* root, node*parent):按key查找结点Node* minNode(node* root):树root的最小结点Node* maxNode(node* root):树root的最大结点Node* preNode(node* target):求前驱结点Node* nextNode(node* targer):求后继结点node* adjustAVL(node* root, node* parent, node* child);调整,保证二叉树的平衡性Node* insertNode(int key, node* root):插入Node* deletevode(int key, node* root):删除Node*createAVL(int* data, int size):创建新的二叉树Void interordertraverse (node*root):中序遍历Void preordertraverse(node* root):先序遍历3.二叉排序树的插入和删除a.二叉排序树的插入在二叉排序树插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义插入过程:若二叉排序树正存在,则返回根结点;当结点不存在时,将待插入到根结点的关键字key和树根关键字parent->key 进行比较.若key<parent->key,则插入到根的左子树中,否则,插入到根的右子树中.而子树中的插入过程和在树中的插入过程相同,如此进行下去,直到把结点作为一个新的树叶插入到二叉排序树中或者直到发现树已有相同关键字的结点为止,并且注意二叉树的平衡,时刻调整.b.二叉排序树的删除假设在二叉排序树上被删结点为*tp,其双亲结点为*parent,且不失一般性,可设*parent是*parent->left的左孩子.下面分了3种情况进行讨论:(1).若*parent结点为叶子结点,即PL和PR均为空树.由于删去叶子结点不破坏整棵树的结构,则只需要修改其双亲,结构点的指针即可.(2).若*parent结点凡有左子树PL或者只有右子树PR,此时只要令PL或PR直接成为其双亲结点*f的左子树即可.显然,作此修改也不破坏二叉排序树的特性.(3).若*parent结点的左子树均不空,并且注意二叉树的平衡性,时刻调整.4.中序遍历和先序遍历Void interordertraverse(node* root)//中序遍历{If(root 1=NULL){Interordertraverse(root->left);Printf("%d,%d\n,"root->key,root->balance);Interordertraverse(root->right);}}Void preordertraverse (node* root)//先序遍历{If (root!=NULL){Printf("%d,%d\n",root->key,root->balance);Preorderstraverse(root->left);Preorderstraverse(root->right);}}5.动态平衡技术的概念Adelson-Velskii 和Landis 提出了一个动态地保持二叉排序树平衡的方法,其基本思想是:在构造二叉排序树的过程中,每当插入一个结点时,首先检查是否因插入而破坏了树的平衡性,如果是因插入结点而破坏了树的平衡性,则找出其中最小不平衡子树,在保持排序树特性的前提下,调整最小不平衡子树中各结点之间的连接关系,以达到新的平衡。

通常将这样得到的平衡二叉排序树简称为AVL 树。

为了保证二叉排序树的高度为lgn,从而保证二叉排序树上实现的插入、删除和查找等基本操作的平均时间为O(lgn),在往树中插入或删除结点时,要调整树的形态来保持树的平衡。

使之既保持BST性质不变又保证树的高度在任何情况下均为O(lgn),从而确保树上的基本操作在最坏情况下的时间均为O(lgn)。

6. 最小不平衡子树的概念以离插入结点最近、且平衡因子绝对值大于1 的结点作根结点的子树。

为了简化讨论,不妨假设二叉排序树的最小不平衡子树的根结点为A ,则调整该子树的规律可归纳为下列四种情况:图3平衡调整的4种基本类型(结点旁的数字是平衡因子)(1)LL 型:新结点X 插在A 的左孩子的左子树里。

调整方法见图3(a)。

图中以 B 为轴心,将A 结点从B 的右上方转到B 的右下侧,使A 成为B 的右孩子。

(2)RR 型:新结点X 插在A 的右孩子的右子树里。

调整方法见图3(b) 。

图中以 B 为轴心,将A 结点从B 的左上方转到B 的左下侧,使A 成为B 的左孩子。

(3)LR 型:新结点X 插在A 的左孩子的右子树里。

调整方法见图3(c) 。

分为两步进行:第一步以X 为轴心,将B 从X 的左上方转到X 的左下侧,使B 成为X 的左孩子,X 成为 A 的左孩子。

第二步跟LL 型一样处理( 应以X 为轴心) 。

(4)RL 型:新结点X 插在A 的右孩子的左子树里。

调整方法见图3(d) 。

分为两步进行:第一步以X 为轴心,将B 从X 的右上方转到X 的右下侧,使B 成为X 的右孩子,X 成为 A 的右孩子。

第二步跟RR 型一样处理( 应以X 为轴心) 。

7.调整叉树的平衡性Node* adjustAVL(node* root,node* parent, node*child)主要有四种调整类型根据平衡因子主要有LR,LL,RL,RR.(1)根据parent->balance的值为2时,child->balance ==-1时是LR型,否则为LL型.(2)Parent->balance的值为-2时,child->balance ==1时是RL型,否则为RR型.8.程序代码设计:(代码部分详见附录)9.运行界面运行界面如下图所示:【注:运行时所执行的操作标注在截图的上方】选择1,输入序列(13,24,37,90,53)创建一刻二叉平衡树,以0为结尾;序列输入完成以后按回车,再选择4,中序输出该树;继续其它操作,选择2,插入一个新结点,其值为1,插入后选择4中序输出该树;继续其它操作,选择3删除一个结点,这里删除结点1,删除后先序输出该树;继续其它操作,输入6,6不是1-5中的树,程序自动退出;注:程序存在已知缺陷(结点删除后的平衡问体,某种状态下删除特殊位置的结点会出现异常),有待弥补。

四、重点及难点重点:1)任一结点的左右子树的高度均相同(如满二叉树),则二叉树是完全平衡的。

通常,只要二叉树的高度为O(1gn),就可看作是平衡的。

2)平衡的二叉排序树指满足BST性质的平衡二叉树。

3)AVL树中任一结点的左、右子树的高度之差的绝对值不超过1。

在最坏情况下,n个结点的AVL树的高度约为1.44lgn。

而完全平衡的二叉树度高约为lgn,AVL树是接近最优的。

难点:平衡二叉树的生成是数据结构中一个重要的存储结构。

由于本程序的输入较多,所以输入数据时必须小心细致。

本程序比较复杂,需要使用结构体并使用了指针。

必须将程序分解为多个子程序以降低编写难度。

想起了软工老师的一句话:"难事破与易",再复杂的事,拆成一个个简单的小部分,逐个击破,在拼凑起来,复杂的事也变的简单了。

适当使用全局常量可以控制有效控制内存溢出。

由于程序较大,调试时多人协作能更容易易找出程序并成功修改。

五、主要结论通过平衡二叉树的生成程序的设计,我们很好的理解了平衡二叉树的生成和各项操作的相关知识,同时还较好的掌握了动态查找相关概念。

六、致谢本课程设计的完成,首先感谢母校——河北工程大学的辛勤培育之恩。

本系统是在刘云老师直接指导下完成的,刘老师从论文的选题,设计计划的安排到具体功能的实现,以及说明书的撰写直至定稿的全过程都给予了精心的指导和严格的要求,对本论文的最后完成给予了莫大的帮助。

在设计过程中刘云老师在百忙中挤出时间多次给予指导,提出了许多宝贵的修改意见。

在这里首先要感谢刘云老师。

其次要感谢程天明和付向飞同学,他们利用自己的宝贵时间与我一起研究系统的设计方面的问题,并且结合自己的经验,给我提出的宝贵的意见和建议,使我的系统得以进一步的完善。

在此也向他们表示由衷的感谢。

然后还要感谢大学以来所有的老师,为我们打下计算机专业知识的基础;同时还要感谢所有的同学们,正是因为有了你们的支持和鼓励。

此次课程设计才会顺利完成。

七、参考文献[1] 王春红,梁普选,王建亮.Delphi程序开发.北京:机械工业出版社2003[2] 张基温,杨晓玲. Visual Basic程序开发教程.北京:清华大学出版社,2004[3] 陈俊源.Delphi程序设计实用教程.北京:电子工业出版社,2000[4] 段兴.Delphi 7程序设计教程[M].北京:清华大学出版社,2003[5] 张宏林,陆华,王思学. Delphi6 编程指南[M].北京:人民邮电出版社,2000八、附录:程序清单#include <stdlib.h>#include <iostream.h> //cout#include <iomanip.h> //setw# define LH 1 //左高# define EH 0 //等高# define RH -1 //右高# define TRUE 1# define FALSE 0int taller=0; //taller反映T长高与否//二叉排序树的类型定义typedef struct BSTNode{int data; //结点值int bf; //结点的平衡因子struct BSTNode * lchild, * rchild; //分别指向左右孩子的指针}BSTNode, *BSTree; //同时声明一个BSTNode和一个指针类型的*BSTree //树的中序遍历的递归算法,一并输出它的平衡因子和左右结点值void MidOrder(BSTree T){//中序遍历的特点是:当二叉树为空,则空操作;否则//1.中序遍历左子树;//2.访问根结点;//3.中序遍历右子树。

相关主题