随机生成平衡二叉树练习平衡二叉树的创建,检验你对平衡二叉树创建的正确性

平衡二叉树的建立代码来自博主waterboy_cj,这个链接通往源代码所在文章
https://blog.csdn.net/waterboy_cj/article/details/81263794

描述

Balanced binary search tree 平衡的二叉搜索树(BBST),也成为AVL树
这段代码主要随机生成些插入序列,和对应的平衡二叉树

你可以在纸上写写画画看看你手写出来的二叉树是不是对的
当正确的次数多了,那你肯定会了

Pre[] 指平衡二叉树的插入顺序

代码自定义

  1. 结点内data大小范围修改,必须是整数 166行

演示

编译器为Visual Studio 2022,调试的自动变量窗口能够看到生成的平衡树结构
在这里插入图片描述

代码

#include <bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100

typedef struct BiTNode
{
	int data; //节点数据
	int bf;	  //平衡因子
	struct BiTNode* lchild, * rchild;
} BiTNode, * BiTree;

void R_Rotate(BiTree* P) //右旋操作
{
	BiTree L;
	L = (*P)->lchild;
	(*P)->lchild = L->rchild;
	L->rchild = *P;
	*P = L;
}

void L_Rotate(BiTree* P) //左旋操作
{
	BiTree R;
	R = (*P)->rchild;
	(*P)->rchild = R->lchild;
	R->lchild = *P;
	*P = R;
}

#define LH +1
#define EH 0
#define RH -1

void LeftBalance(BiTree* T) //左平衡旋转操作
{
	BiTree L, Lr;
	L = (*T)->lchild;
	switch (L->bf)
	{
	case LH:
		(*T)->bf = L->bf = EH;
		R_Rotate(T);
		break;
	case RH:
		Lr = L->rchild;
		switch (Lr->bf)
		{
		case LH:
			(*T)->bf = RH;
			L->bf = EH;
			break;
		case EH:
			(*T)->bf = L->bf = EH;
			break;
		case RH:
			(*T)->bf = EH;
			L->bf = LH;
			break;
		}
		Lr->bf = EH;
		L_Rotate(&(*T)->lchild);
		R_Rotate(T);
	}
}

void RightBalance(BiTree* T)
{
	BiTree R, Rl;
	R = (*T)->rchild; /*  R指向T的右子树根结点 */
	switch (R->bf)
	{		 /*  检查T的右子树的平衡度,并作相应平衡处理 */
	case RH: /*  新结点插入在T的右孩子的右子树上,要作单左旋处理 */
		(*T)->bf = R->bf = EH;
		L_Rotate(T);
		break;
	case LH:			/*  新结点插入在T的右孩子的左子树上,要作双旋处理 */
		Rl = R->lchild; /*  Rl指向T的右孩子的左子树根 */
		switch (Rl->bf)
		{ /*  修改T及其右孩子的平衡因子 */
		case RH:
			(*T)->bf = LH;
			R->bf = EH;
			break;
		case EH:
			(*T)->bf = R->bf = EH;
			break;
		case LH:
			(*T)->bf = EH;
			R->bf = RH;
			break;
		}
		Rl->bf = EH;
		R_Rotate(&(*T)->rchild); /*  对T的右子树作右旋平衡处理 */
		L_Rotate(T);			 /*  对T作左旋平衡处理 */
	}
}

bool InsertAVL(BiTree* T, int e, bool* taller)
{
	if (!*T)
	{ /*  插入新结点,树“长高”,置taller为TRUE */
		*T = (BiTree)malloc(sizeof(BiTNode));
		(*T)->data = e;
		(*T)->lchild = (*T)->rchild = NULL;
		(*T)->bf = EH;
		*taller = TRUE;
	}
	else
	{
		if (e == (*T)->data)
		{ /*  树中已存在和e有相同关键字的结点则不再插入 */
			*taller = FALSE;
			return FALSE;
		}
		if (e < (*T)->data)
		{											  /*  应继续在T的左子树中进行搜索 */
			if (!InsertAVL(&(*T)->lchild, e, taller)) /*  未插入 */
				return FALSE;
			if (*taller)		  /*   已插入到T的左子树中且左子树“长高” */
				switch ((*T)->bf) /*  检查T的平衡度 */
				{
				case LH: /*  原本左子树比右子树高,需要作左平衡处理 */
					LeftBalance(T);
					*taller = FALSE;
					break;
				case EH: /*  原本左、右子树等高,现因左子树增高而使树增高 */
					(*T)->bf = LH;
					*taller = TRUE;
					break;
				case RH: /*  原本右子树比左子树高,现左、右子树等高 */
					(*T)->bf = EH;
					*taller = FALSE;
					break;
				}
		}
		else
		{											  /*  应继续在T的右子树中进行搜索 */
			if (!InsertAVL(&(*T)->rchild, e, taller)) /*  未插入 */
				return FALSE;
			if (*taller)		  /*  已插入到T的右子树且右子树“长高” */
				switch ((*T)->bf) /*  检查T的平衡度 */
				{
				case LH: /*  原本左子树比右子树高,现左、右子树等高 */
					(*T)->bf = EH;
					*taller = FALSE;
					break;
				case EH: /*  原本左、右子树等高,现因右子树增高而使树增高  */
					(*T)->bf = RH;
					*taller = TRUE;
					break;
				case RH: /*  原本右子树比左子树高,需要作右平衡处理 */
					RightBalance(T);
					*taller = FALSE;
					break;
				}
		}
	}
	return TRUE;
}

// 生成 1~30 的随机数
int Round()
{
	int a = 1;
	int b = 30;
	return (rand() % (b - a + 1)) + a;
}

BiTree GenerateBBST(int n)
{
	set<int> ss;
	BiTree bbst = NULL;
	bool taller;
	int cnt = 0;
	cout << "Pre[]:";
	while (cnt < n)
	{
		int c = Round();
		if (ss.find(c) == ss.end())
		{
			ss.insert(c);
			cnt++;
			InsertAVL(&bbst, c, &taller);
			cout << c << " ";
		}
	}
	cout << endl;
	return bbst;
}

BiTree GenerateBBST(int A[], int n)
{
	BiTree bbst = NULL;
	bool taller;
	cout << "Pre[]:";
	for (int i = 0; i < n; i++) {
		InsertAVL(&bbst, A[i], &taller);
		cout << A[i] << " ";
	}
	cout << endl; 
	return bbst;
}

int main(void)
{
	int n, m;
	cout << "请输入生成BBST的数量和一颗BBST中结点的数量" << endl;
	cin >> n >> m;
	cout << "生成" << n << "颗BBST, 其中一颗BBST中有" << m << "个结点" << endl;
	BiTree B[30];
	int i = 0;
	while (i<n)
	{
		cout << "---------------------------------" << endl;
		B[i++] = GenerateBBST(m);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值