平衡二叉树(笔记)

平衡二叉树

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef struct BanlanceTree
{
	int value;
	int hight;
	struct BanlanceTree *leftChild, *rightChild;
}BanlanceTree;
BanlanceTree *head;

void initTree()
{
	head = (BanlanceTree *)malloc(sizeof(BanlanceTree));
	head->value = 10000;
	head->leftChild = NULL;
	head->rightChild = NULL;
	head->hight = 0;
}

BanlanceTree* Search(BanlanceTree *node, BanlanceTree *parent, int value)
{
	if (!node)return parent;
	if (node->value == value)return node;
	else if (node->value < value)return Search(node->rightChild, node, value);
	else if (node->value > value)return Search(node->leftChild, node, value);
}

int GetDepth(BanlanceTree *node)
{
	if (node == NULL)return 0;
	else return max(GetDepth(node->leftChild), GetDepth(node->rightChild)) + 1;
}

void GetBalance(BanlanceTree *node)
{
	node->hight = max(GetDepth(node->leftChild), GetDepth(node->rightChild));
}
void UpdateHight(BanlanceTree *node)
{
	if (!node)return;
	UpdateHight(node->leftChild);
	UpdateHight(node->rightChild);
	GetBalance(node);
}


//右单旋转
void RoateRight(BanlanceTree *&node)
{
	BanlanceTree *temporary = NULL;
	temporary = node->leftChild;
	node->leftChild = temporary->rightChild;
	temporary->rightChild = node;
	node = temporary;
	UpdateHight(node);
}

//左单旋转
void RoateLeft(BanlanceTree *&node)
{
	BanlanceTree *temporary = NULL;
	temporary = node->rightChild;
	node->rightChild = temporary->leftChild;
	temporary->leftChild = node;
	node = temporary;
	UpdateHight(node);
}



bool AVLInsert(BanlanceTree *&node,int value, BanlanceTree *parent)
{
	if (!node)
	{
		node = (BanlanceTree *)malloc(sizeof(BanlanceTree));
		node->value = value;
		node->leftChild = NULL;
		node->rightChild = NULL;
		if (value > parent->value)parent->rightChild = node;
		else parent->leftChild = node;
		return true;
	}
	if (value == node->value)return false;
	bool res = true;
	if(value>node->value)
	{
		res = AVLInsert(node->rightChild, value,node);
		if (res && GetDepth(node->leftChild) - GetDepth(node->rightChild)<-1)
		{
			if (value > node->rightChild->value)RoateLeft(node);
			else if(value < node->rightChild->value)
			{
				RoateRight(node->rightChild);
				RoateLeft(node);
			}
		}
	}
	else if (value < node->value)
	{
		res = AVLInsert(node->leftChild, value,node);
		if (res && GetDepth(node->leftChild) - GetDepth(node->rightChild)>1)
		{
			if (value < node->leftChild->value)RoateRight(node);
			else if (value > node->leftChild->value)
			{
				RoateLeft(node->leftChild);
				RoateRight(node);
			}
		}
	}
	if (res)UpdateHight(node);
	return res;
}

void print(BanlanceTree *node)
{
	if (!node)return;
	print(node->leftChild);
	if(node->value!= 10000)cout << node->value << endl;
	print(node->rightChild);
}
void Delete_AVL(BanlanceTree *&node, BanlanceTree *p)
{
	if (!node->rightChild)
	{
		BanlanceTree *k=node;
		p->value = node->value;
		node = node->leftChild;
		free(k);
	}
	else
	{
		Delete_AVL(node->rightChild, p);
		if (GetDepth(node->leftChild) - GetDepth(node->rightChild) > 1)
			RoateLeft(node);
	}
	UpdateHight(node);
}

bool DeleteItem(BanlanceTree *&node,int value)
{
	if (!node)return false;
	bool res = true;
	if (node->value == value)
	{
		if (!node->leftChild)
			node = node->rightChild;
		else if (!node->rightChild)
			node = node->leftChild;
		else
			Delete_AVL(node->leftChild, node);
	}
	else if(node->value>value)
	{
		res = DeleteItem(node->leftChild, value);
		if (res && GetDepth(node->leftChild)-GetDepth(node->rightChild)>1)
		{
			if (value < node->leftChild->value)
				RoateLeft(node);
			else
			{
				RoateLeft(node->leftChild);
				RoateRight(node);
			}
		}
		else if (res && GetDepth(node->leftChild) - GetDepth(node->rightChild) < -1)
		{
			if (value > node->rightChild->value)
				RoateRight(node);
			else
			{
				RoateRight(node->rightChild);
				RoateLeft(node);
			}
		}
	}
	else if(node->value<value)
	{
		res = DeleteItem(node->rightChild, value);
		if (res && GetDepth(node->leftChild) - GetDepth(node->rightChild) > 1)
		{
			if (value < node->leftChild->value)
				RoateLeft(node);
			else
			{
				RoateLeft(node->leftChild);
				RoateRight(node);
			}
		}
		else if (res && GetDepth(node->leftChild) - GetDepth(node->rightChild) < -1)
		{
			if (value > node->rightChild->value)
				RoateRight(node);
			else
			{
				RoateRight(node->rightChild);
				RoateLeft(node);
			}
		}
	}
	if (res)UpdateHight(node);
	return res;
}
int main()
{
	initTree();
	int n = 7;
	int a[100] = { 10,5,2,6,11,12,1};
	for (int i = 0; i < n; i++)
		AVLInsert(head, a[i],head);
	DeleteItem(head,11);
	print(head);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值