- 9
- 0
- 约1.96万字
- 约 19页
- 2021-11-12 发布于江苏
- 举报
《数据结构》
课程设计报告
专 业:
班 级:
姓 名:
指导教师:
学 号:
2010 年 7 月 5 日
二叉平衡排序树
一、课程设计内容
问题描述: 从一棵空树开始创建,在创建过程中, 保证树的有序性,同时还要针对树的
平衡性做些调整。最终要把创建好的二叉排序树转换为二叉平衡排序树。
基本要求: 1. 创建(插入、调整、改组)
2. 输出
二、主要算法说明
1、 . 主要数据结构定义
typedef struct node node;
struct node
{
node* parent;
node* left;
node* right;
int balance; // 左右子树高度之差
int key;
};
2、主要函数说明
int searchNode(int key, node* root, node** parent) :按 key 查找结点
node* minNode(node* root) :树 root 的最小结点
node* maxNode(node* root) :树 root 的最大结点
node* preNode(node* target) :求前驱结点
node* nextNode(node* target) :求后继结点
node* adjustAVL(node* root, node* parent, node* child) :调整,保证二叉树的平衡
性
node* insertNode(int key, node* root) :插入
node* deleteNode(int key, node* root) : 删除
node* createAVL(int *data, int size) :建造新的二叉树
void interordertraverse(node* root) :中序遍历
void preordertraverse(node* root) :先序遍历
3、二叉排序树的插入和删除
a. 二叉排序树的插入
在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。
插入过程:若二叉排序树已存在,则返回根节点;
当节点不存在时,将待插结点关键字 key 和树根关键字 parent-key 进行比较,
若 keyparent-key ,则插入到根的左子树中,
否则, 则插入到根的右子树中。 而子树中的插入过程和在树中的插入过程相同, 如此进行下
去,直到把结点作为一个新的树叶插入到二叉排序树中, 或者直到发现树已有相同关键字的
结点为止。并且注意二叉树的平衡性,时刻调整。
b. 二叉排序树的删除
假设在二叉排序树上被删结点为 *tp ,其双亲结点为 *parent ,且不失一般性, 可设 * *parent
是* parent-left; 的左孩子。
下面分 3 种情况进行讨论:
(1)若 *parent 结点为叶子结点,即 PL 和 PR均为空树。由于删去叶子结点不破坏整棵树
的结构,则只需要修改其双亲结点的指针即可。
(2 )若*parent 结点只有左子树 PL或者只有右子树 PR,此时只要令 PL 或 PR直接成为其双
亲结点 *f 的左子树即可。显然,作此修改也不破坏二叉排序树的特性。
(3 )若 *parent 结点的左子树和右子树均不空。
并且注意二叉树的平衡性,时刻调整。
4、中序遍历和先序遍历
void interorde
原创力文档

文档评论(0)