中北大学
数 据 结 构
课 程 设 计 说 明 书
学生姓名: | 刘永强 | 学 号: 壁纸图片 | 碧海墨峰1021010327 |
学 院: | 软件学院 |
专 业: | 软件工程 |
题 目: | 二叉平衡排序树 |
指导教师 | 何志英 |
| | | 豆沙汤圆的做法 |
2011年12月20日
1.设计任务概述
用二叉链表作存储结构,编写程序实现二叉排序树上的基本操作:以回车('\n')为输入结束标志,输入数列L,生成二叉排序树T;对二叉排序树T作中序遍历;计算二叉排序树T的平均查找长度,输出结果;输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历;否则输出信息“无结点x”;
判断二叉排序树T是否为平衡二叉树;再用数列L,生成平衡二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡二叉排序树,则立即将它转换成新的平衡二叉排序树BT;计算平衡的二叉排序树BT的平均查找长度,输出结果。
2.本设计所采用的数据结构
输入功能:可以输入结点
输出功能:可以输出结点
插入功能:可以插入结点
删除功能:可以删除结点
查找功能:可以查找结点
结束功能:可以终止输入
3.功能模块详细设计
3.1 详细设计思想:
从一颗空树开始创建,在创建过程中,保证树的有序性,同时还要针对树的平衡性做些调整。最终要把创建好的二叉排序树转换为二叉平衡排序树。
基本要求:
(1)创建(插入、调整、改组);
(2)输出。
3.2 核心代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <asrt.h>
typedef struct node node;
struct node
{
node* parent;
node* left;
node* right;
int balance;
int key;
};
extern void interordertraver(node* root);
extern void preordertraver(node* root);
extern void postordertraver(node* root);
int archNode(int key, node* root, node** parent)
{
node* temp;
asrt(root != NULL);
temp = root;
林俊杰国籍 *parent = root->parent;
while (temp !=NULL)
{
if (temp->key == key) return 1;
借贷英文 el
{
*parent = temp;
if (temp->key > key)
temp = temp->left;
el
temp = temp->right;
}
}
return 0;
}
口腔溃疡吃什么好的快node* minNode(node* root)
{
if (root == NULL)
return NULL;
while (root->left != NULL)
root = root->left;
return root;
}
偶尔的英文node* maxNode(node* root)
{
if (root == NULL)
return NULL;
while (root->right != NULL)
root = root->right;
return root;
}
node* preNode(node* target)
{
if (target == NULL)
return NULL;
if (target->left != NULL)
return maxNode(target->left);
el
while ((target->parent!=NULL) && (target!=target->parent->right))
target = target->parent;
return target->parent;
}
node* nextNode(node* target)
{
if (target == NULL)
return NULL;
if (target->right != NULL)
return minNode(target->right);
el
while ((target->parent!=NULL) && (target!=target->parent->left))
target = target->parent;
return target->parent;
}
node* adjustAVL(node* root, node* parent, node* child)
{
node *cur;
asrt((parent != NULL)&&(child != NULL));
switch (parent->balance)
{
ca 2:
if (child->balance == -1)
{
cur = child->right;
cur->parent = parent->parent;
child->right = cur->left;
if (cur->left != NULL)
cur->left->parent = child;
parent->left = cur->right;
if (cur->right != NULL)
cur->right->parent = parent;动物动漫
cur->left = child;
child->parent = cur;