问题及描述:
/*
*Copyright(c++)2015,烟台大学计算机与控制工程学院
*All rights reserved,
*文件名称:main.cpp
*作 者:程梦莹
*完成日期:2015年11月30日
*版本号:v1.0
*问题描述: 认真阅读并验证平衡二叉树相关算法。
(1)由整数序列{43,52,75,24,10,38,67,55,63,60}构造AVL树;
(2)输出用括号法表示的AVL树;
(3)查找关键字55;
(4)分别删除43和55,输出删除后用括号法表示的二叉排序树。
*输出描述:
*/
#include <stdio.h>
#include <malloc.h>
typedef int KeyType; //定义关键字类型
typedef char InfoType;
typedef struct node //记录类型
{
KeyType key; //关键字项
int bf; //平衡因子
InfoType data; //其他数据域
struct node *lchild,*rchild; //左右孩子指针
} BSTNode;
void LeftProcess(BSTNode *&p,int &taller)
//对以指针p所指结点为根的二叉树作左平衡旋转处理,本算法结束时,指针p指向新的根结点
{
BSTNode *p1,*p2;
if (p->bf==0) //原本左、右子树等高,现因左子树增高而使树增高
{
p->bf=1;
taller=1;
}
else if (p->bf==-1) //原本右子树比左子树高,现左、右子树等高
{
p->bf=0;
taller=0;
}
else //原本左子树比右子树高,需作左子树的平衡处理
{
p1=p->lchild; //p指向*p的左子树根结点
if (p1->bf==1) //新结点插入在*b的左孩子的左子树上,要作LL调整
{
p->lchild=p1->rchild;
p1->rchild=p;
p->bf=p1->bf=0;
p=p1;
}
else if (p1->bf==-1) //新结点插入在*b的左孩子的右子树上,要作LR调整
{
p2=p1->rchild;
p1->rchild=p2->lchild;
p2->lchild=p1;
p->lchild=p2->rchild;
p2->rchild=p;
if (p2->bf==0) //新结点插在*p2处作为叶子结点的情况
p->bf=p1->bf=0;
else if (p2->bf==1) //新结点插在*p2的左子树上的情况
{
p1->bf=0;
p->bf=-1;
}
else //新结点插在*p2的右子树上的情况
{
p1->bf=1;