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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、课程设计题目

二叉平衡排序树

摘要问题描述:从一棵空树开始创建,在创建过程中,保证树的有序性,同时还要针对树的平衡性做些调整。最终要把创建好的二叉排序树转换为二叉平衡排序树。

基本要求: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 进行比较.

若keykey,则插入到根的左子树中,否则,插入到根的右子树中.而子树中的插入过程和在树中的插入过程相同,如此进行下去,直到把结点作为一个新的树叶插入到二叉排序树中或者直到发现树已有相同关键字的结点为止,并且注意二叉树的平衡,时刻调整.

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 ,则调整该子树的规律可归纳为下列四种情况:

相关文档
最新文档