数据结构课设(五)二叉排序树与平衡二叉树的实现 C代码
一、问题描述
假定二叉排序树与平题所处理数据均为整型。分别采用二叉链表和顺序表作存储结构,实现对二叉衡二叉树的操作。具体要求如下:
(1)用二叉链表作存储结构:
①读入一个整数序列L(要求该整数序列从磁盘文件读取),生成一棵二叉排序树②对二叉排序树T作中序遍历,输出结果。③计算二叉排序树T查找成功的平均查找长度,输出结果。④输入元素x,查找二叉排序树T。若存在含x的结点,则删除该结点,并作中序遍历(执行操作②);否则输出信息“无x”。⑤用数列L,生成一棵平衡的二叉排序树BT。如果当插人新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则将它转换成平衡的二叉排序树BT.⑥计算平衡的二叉排序树BT的平均查找长度,输出结果。
(2)用顺序表作存储结构:
①读人一个整数序列L(要求该整数序列从磁盘文件读取),生成一棵二叉排序树T.②对二叉排序树T作中序遍历,输出结果。③计算二叉排序树T查找成功的平均查找长度,输出结果。④输人元素x,查找二叉排序树T. 若存在含x的结点,则删除该结点,并作中序遍历。
二、代码
经过分析,本题需要完成的需求是:分别以顺序表和二叉链表完成输入,中序遍历排序,查删结点,求平均查找长度的操作。
1.C代码
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node
{
int data;
int height;
Node *rchild,*lchild,*parent;
}BSTNode,*BSTree;
BSTNode *T;
void insertBST(int k)
{
BSTNode *y=NULL;
BSTNode *x=T;
BSTNode *z;
z=(BSTNode *)malloc(sizeof(Node));
z->data=k;
z->height=1;
z->lchild=NULL;
z->rchild=NULL;
while(x!=NULL)
{
y=x;
if(z->data<x->data)
{
x=x->lchild;
z->height++;
}
else
{
x=x->rchild;
z->height++;
}
}
z->parent=y;
if(y==NULL) T=z;
else
{
if(z->data<y->data) y->lchild=z;
else y->rchild=z;
}
}
void Inorder(BSTNode *u)
{
if(u==NULL) return;
Inorder(u->lchild);
printf("%d ",u->data);
Inorder(u->rchild);
}
double CalLength(BSTree *T)
{
static double length=0;
static int n=0;
if(*T)
{
length+=(*T)->height;
CalLength(&(*T)->lchild);
n++;
CalLength(&(*T)->rchild);
}
return length/n;
}
BSTree SearchDeleteBST(int key) //删除函数
{
BSTree p=T,q=NULL,s,f;
while(p!=NULL) //查找要删除的点
{
if(p->data==key)
break;
q=p; //q指向要删结点的父母
if(p->data>key) p=p->lchild;
else p=p->rchild;
}
if(p==NULL)
return T; //查找失败
if(p->lchild==NULL) //p指向当前要删除的结点
{
if(q==NULL) T=p->rchild;
else if(q->lchild==p) q->lchild=p->rchild; //p为q的左孩子
else q->rchild=p->rchild; //p为q的右孩子
free(p);
}
else
{
//p的左孩子不为空
f=p;
s=p->lchild;
while(s->rchild) //左拐后向右走到底
{
f=s;
s=s->rchild;
}
if(f==p) f->lchild=s->lchild; //重接f的左子树
else f->rchild=s->lchild; //重接f的右子树
p->data=s->data;
free (s);
}
return T;
}
int searchBST(BSTree T,int key,BSTree f,BSTree *p) //查找函数
{
if(!T