IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【数据结构与算法】平衡二叉查找树的功能实现 -> 正文阅读

[数据结构与算法]【数据结构与算法】平衡二叉查找树的功能实现

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct TreeNode
{
	int data;
	struct TreeNode* left;
	struct TreeNode* right;
	int hight;
}TreeNode;
//创建结点
TreeNode* create_node(int data)
{
	TreeNode* node = malloc(sizeof(TreeNode));
	node->data = data;
	node->left = NULL;
	node->right = NULL;
	node->hight = 1;
	return node;
}
//读取树高
int hight_tree(TreeNode* root)
{
	if(NULL == root)
		return 0;
	return root->hight;
}
//计算树高
void count_hight(TreeNode* root)
{
	if(NULL == root)
		return;
	int lh = hight_tree(root->left);
	int rh = hight_tree(root->right);
	root->hight = lh>rh ? lh+1 : rh+1;
}
//添加树的子函数
void _add_tree(TreeNode** root,TreeNode* node)
{
	if(NULL == *root)
	{
		*root = node;
		return;
	}

	if(node->data < (*root)->data)
		_add_tree(&(*root)->left,node);
	else
		_add_tree(&(*root)->right,node);
	count_hight(*root);
}
//添加树
void add_tree(TreeNode** root,int data)
{
	_add_tree(root,create_node(data));
}
//中序遍历 为了可以换行分了两个函数
void _ldr_show(TreeNode* root)
{
	if(NULL == root)
		return;
	_ldr_show(root->left);
	printf("%d ",root->data);
	_ldr_show(root->right);
}

void ldr_show(TreeNode* root)
{
	_ldr_show(root);
	printf("\n");
}

//右旋转
void right_rotate(TreeNode** root)
{
	TreeNode* A = *root;
	TreeNode* B = A->left;
	TreeNode* t2 = B->right;

	*root = B;
	B->right = A;
	A->left = t2;

	count_hight(A);//重新计算高度
	count_hight(B);
}
//左旋转
void left_rotate(TreeNode** root)
{
	TreeNode* A = *root;
	TreeNode* B = A->right;
	TreeNode* t2 = B->left;

	*root = B;
	B->left = A;
	A->right = t2;
	count_hight(A);
	count_hight(B);
}
//使树自下而上趋于平衡
void avl_tree(TreeNode** root)
{
	if(NULL==*root || (NULL==(*root)->left && NULL==(*root)->right))
		return;

	avl_tree(&(*root)->left);
	avl_tree(&(*root)->right);

	int avl = hight_tree((*root)->left)-hight_tree((*root)->right);
	if(avl > 1)
	{
		if(0 < hight_tree((*root)->left->left) - hight_tree((*root)->left->right))
		{
			/*
				   A		以B为轴向右旋转		
				  / \
				 B  t1				 B
				/ \                /   \
			   C  t2              C     A
			  / \                / \   / \
			 t4 t3              t4 t3 t2 t1 
			*/
			right_rotate(root);
		}
		else
		{
			/*
			  A 						A
			 / \   以C为轴向左旋转  	   / \
			B   t1                    C  t1
		   / \                       / \
		  t2  C                     B  t4
		     / \                   / \
			t3 t4                 t2  t3
			*/
			left_rotate(&(*root)->left);
			right_rotate(root);
		}
		avl_tree(root);
	}
	else if(avl < -1)
	{
		if(0 > hight_tree((*root)->right->left) - hight_tree((*root)->right->right))
		{
			/*
			     A			以B为轴向左旋转
		    	/ \
			   t1  B					 B
			      / \				   /   \
			     t2  C                A     C 
                    / \              / \   / \
				   t3  t4           t1 t2 t3 t4
			*/
			left_rotate(root);
		}
		else
		{
			/*
				A							A
			   / \		以C为轴向右旋转       / \
			  t1  B                       t1  C
				 / \                         / \
				C   t2                     t3   B
			   / \                             / \
			  t3 t4                           t4 t2 
		    */
			right_rotate(&(*root)->right);
			left_rotate(root);
		}
		avl_tree(root);
	}
}
//判断平衡
bool blance_tree(TreeNode* root)
{
	if(NULL == root)
		return true;
	int lh = hight_tree(root->left);
	int rh = hight_tree(root->right);
	return abs(lh-rh)<2 && blance_tree(root->left) && blance_tree(root->right);
}
//测试
int main(int argc,const char* argv[])
{
	TreeNode* root = NULL;
	for(int i=10; i>0; i--)
	{
		add_tree(&root,i);
	}
	ldr_show(root);
	printf("is blance %d\n",blance_tree(root));
	avl_tree(&root);
	printf("-----------------\n");
	printf("is blance %d\n",blance_tree(root));
	ldr_show(root);
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 21:48:54  更:2021-08-07 21:49:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:46:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码