二叉排序树与平衡二叉树的实现

本文介绍了如何使用C语言实现二叉排序树和平衡二叉排序树,包括插入、删除、查找操作。通过二叉链表和顺序表两种存储结构分别实现,还提供了平衡调整的AVL树插入操作。最后展示了中序遍历和计算平均查找长度的代码。
摘要由CSDN通过智能技术生成
一、实验目的
1、问题描述
     分别采用二叉链表和顺序表作存储结构,实现对二叉排序树与平衡
 二叉树的操作。
2、设计功能要求
(1)用二叉链表作存储结构实现二叉排序树。
      1)以回车符(‘\n’)为输入结束标志,输入数列L,生成一棵二叉排序
 树T;
      2)对二叉排序树T作中序遍历,输出结果;
      3)计算二叉排序树T查找成功的平均查找长度,输出结果;
      4)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结
 点,并作中序遍历(执行操作2);否则,输出信息“无x”;
(2)用顺序表(一维数组)作存储结构----静态链表
      1)以回车符(‘\n’)为输入结束标志,输入数列L,生成一棵二叉排序
 树T;
      2)对二叉排序树T作中序遍历,输出结果;
      3)计算二叉排序树T查找成功的平均查找长度,输出结果;
      4)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结
 点,并作中序遍历(执行操作2);否则,输出信息“无x”;
(3)用二叉链表作存储结构实现平衡的二叉排序树。
      1)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现
 当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平
 衡的二叉排序树BT;
      2)计算平衡的二叉排序树BT的平均查找长度,输出结果。
二、算法难点
建立二叉排序树,在二叉排序树中删除结点;建立平衡二叉树并在其中插入或删除结点;计算平均查找长度。
三、解决思路及算法
1、用二叉链表作存储结构实现二叉排序树。
建二叉树的结点,包含5个成员,分别存放结点的数据data,结点在树中的高度height,左子女结点指针*lchild,子女结点指针*rchild和指向父结点的指针*parent。整个二叉树的链表要有一个表头指针*T,它指向二叉树的根结点,其作用是当作树的访问点。
InsertBST以根为起点寻找结点z该插入的位置,设当前结点为x,如果z的值小于x则将当前节点的左子结点作为下一个x,反之则以右子结点作为下一个x,如此不断向叶结点搜索,在此过程中,程序将前一个结点保存在y中,用作z的候选父结点,当x为空时y就是z的父结点。从空的二叉排序树开始,经过一系列的插入操作以后,生成了一棵二叉排序树。
中序遍历二叉树算法的框架是:若二叉树为空,则空操作;否则,中序遍历左子树(L);然后访问根结点(V);最后中序遍历右子树(R)。
在删除结点时,我们首先要查找所需要删除的节点。找到该结点p后DeleteBST需要考虑三种情况:当p为叶子结点,可直接删除;当p只有左子树或右子树时,将p的父结点直接指向左子树或右子树;当p左右子树均存在,在p的左子树上找最右结点s,若s是叶子结点,则将s的值赋给p,然后置空指针,否则,s的父结点指向s的指针将指向s的左子树,最后释放s。
计算平均查找长度时,利用中序遍历的方法,求所有结点的高度喝,再除以结点个数即可。
2、用顺序表(一维数组)作存储结构----静态链表。
建立二叉排序树,首先用一个一维数组记录下读入的数据,数组中剩余的值用0补齐。建立二叉树,包括所有数据域*data和总结点个数dnum。每读入一个数据的同时将该数据插入到二叉树相应位置,若key小于数组中第i个数的值则将key插入到2*i的位置,反之插入到2*i+1的位置。
中序遍历二叉树也采用递归函数的方式,先访问左子树2*i,然后访问根节点i,最后访问右子树2*i+1。
计算二叉树平均查找长度时,要调用查找函数search,采用遍历数组的方式,边查找结点边累计查找长度length,然后除以总结点数即可。
删除二叉排序树结点的时候,要重新建立一个一维数组作为存储新树的空间,将原数组中的数据一个一个插入树中,若遇到需要删除的节点则不执行插入操作。
3、用二叉链表作存储结构实现平衡的二叉排序树。
首先构建平衡二叉树的结点,包括数值data,平衡因子BF,左子女结点指针*lchild,子女结点指针*rchild。
然后构建平衡旋转函数,分别有LL,LR,RL,RR四种类型,每一个旋转类型,都要对应着改变指针指向以及平衡因子。
然后是结点插入函数InsertAVL,分为三种情况:原本左子树比右子树高,需要做左平衡处理;原本左右子树等高,现因左子树增高而树增高;原本右子树比左子树高,现在左右子树等高。
中序遍历算法和计算平均查找长度算法同上。
四、测试样例

1、用二叉链表作存储结构实现二叉排序树。



 

2、用顺序表(一维数组)作存储结构----静态链表

<
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值