数据结构课设(五)二叉排序树与平衡二叉树的实现

文章介绍了如何使用C语言实现二叉排序树和平衡二叉树的数据结构操作,包括插入、中序遍历、查找、删除节点以及计算平均查找长度。提供了二叉链表和顺序表两种存储结构的代码示例,特别地,对于平衡二叉树,还涉及到了平衡调整的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构课设(五)二叉排序树与平衡二叉树的实现 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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值