实现平衡二叉排序树的各种算法代码 一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现平衡二叉排序树的各种算法代码一
/* 《实现平衡二叉排序树的各种算法》
一、分析题目要求
用函数实现如下平衡二叉排序树算法,:
(1)插入新结点
(2)前序、中序、后序遍历二叉树(递归)
(3)前序、中序、后序遍历的非递归算法
(4)层次遍历二叉树
(5)在二叉树中查找给定关键字(函数返回值为成功1,失败0)
(6)交换各结点的左右子树
(7)求二叉树的深度
(8)叶子结点数
(9)删除某结点
为了完成以上的各项操作,首先应该用函数建一棵平衡二叉排序树,输入形式是首先输入要建的二叉树的结点数,然后依次输入各个结点的值。在实现插入新结点的函数时,需要一个向一棵二叉树插入新结点的函数。可用递归算法写出平衡二叉树的前序,中序,后序遍历的函数。在写平衡二叉树的前,中,后序遍历的非递归算法时要用到栈结构的知识,运用栈结构来存储平衡二叉树结点的指针。在层次遍历二叉树时需要用到队列结构,运用队列结构的先进先出来存储二叉树的结点指针。在遍历二叉树的结点时需要一个访问结点数据的函数。二叉树是一棵排序树,所以二叉树的查找可以运用其有序的性质,查找的方式和建树的方式相似。交换二叉树各结点的左右子树时,可以用先序遍历递归的方式从根结点向下递归,每次访问结点时就需将各结点的左右孩子的指针调换,并对该结点的平衡因子作相应的处理。示二叉树的深度时,可用递归的方式访问结点的左右子树,并记录下左右子树的深度,最后返回左右子树中较深的深度的值即可。可以用一次遍历的方式遍历二叉树,记录每一个经过的结点,若结点存在且左右孩子都为空,则该结点为叶子结点。删除二叉树的某个结点时,首先要写一个函数,用递归查找的方式找到相应的结点,该函数还要有调整二叉树平衡的作用,因为若删除结点使得二叉树深度减少而不平衡,需要调整二叉树的平衡,若该结点不存在则返回ERROR,,若存在该结点,则应该再写一个函数来删除该结点,在删除之前还要判断该结点是只有左子树还是只有右子树还是左右子树都有的情况:若只有左或是只有右子树,则只需删除该结点,并回溯调整二叉树的平衡;若该结点的左右子树都有,则应该用另一个函数递归找到该结点的直接“后继”,并从该“后继”开始回溯调整二叉树的平衡。
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define EH 0
#define RH -1
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
#define STACK_INIT_SIZE 100 // 栈
#define STACKINCREMENT 10 // 栈
#defi
ne MAXQSIZE 100 //队列
#define ElemType int
#define Status int
#define TRUE 1
#define FALSE 0
#define Boolean bool
//-----------------------------------------结构体
typedef struct BSTNode//平衡二叉树结构
{
ElemType data;
int bf;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
typedef BSTree SElemType; //栈
typedef BSTree QElemType; //队列
typedef struct //队列的结构体
{
QElemType *base;
int front;
int rear;
}SqQueue;
typedef struct SqStack //栈的结构体
{
SElemType *base;
SElemType *top;
}SqStack;
//-------------------------------------函数列表
//队列
Status InitQueue(SqQueue &Q); //初始化队列
Status EnQueue(SqQueue &Q,QElemType e); //进队列
Status DeQueue(SqQueue &Q,QElemType &e); //出队列
Status GetHead(SqQueue Q,QElemType &e); //获队列首
int QueueLength(SqQueue Q); //队列长度
Status QueueTraverse(SqQueue Q); //遍历队列
//栈
Status InitStack(SqStack &S); //初始化栈
Status Push(SqStack &S,SElemType e); //进栈
Status Pop(SqStack &S,SElemType &e); //出栈
Status GetTop(SqStack S,SElemType &e); //获栈顶
int StackLength(SqStack S); //栈的长度
Status StackEmpty(SqStack S); //判栈空
Status StackTraverse(SqStack S); //栈的遍历
//平衡二叉树
void R_Rotate(BSTree &p); //右旇
void L_Rotate(BSTree &p); //左旇
Status InsertAVL(BSTree &T,ElemType e,Boolean &taller);//平衡二叉树结点插void LeftBalance(BSTree &T); //左平衡
void RigthBalance(BSTree &T); //右平衡
Status CreateBST(BSTree &T,int n); //建树
Status Visit(ElemType e); //访问
Status PreOrderTraverse(BSTree T); //前序遍历
Status InOrderTraverse(BSTree T); //中序遍历
Status PostOrderTraverse(BSTree T); //后序遍历
Status preOrderIter(BSTree T); //前序非递归遍历
Status inOrderIter(BSTree T); //中序非递归遍历
Status postOrderIter(BSTree T); //后序非递归遍历
Status FindBST(BSTree T,ElemType key,int &n);//在二叉树中查找关键词
Status OverTraverse(BSTree &T); //层次遍历
Status OverChang(BSTree &T); //交换左右子树
int BSTDeep(BSTree T); //求树的深度
Status Sum(BSTree T,int &n); //求叶子结点数
Status DeleteBST(BSTree &T,int key,bool &taller);//删除结点
Status Delete(BSTree &p,bool &taller);
Status Delete2(BSTree &p,bool taller,ElemType &f);
void MU(); //选择菜单
//-------------------------------------
//-------------------------------------初始化队列