平衡二叉搜索树/AVL二叉树 C实现
//AVTree.h
#ifndef MY_AVLTREE_H
#define MY_AVLTREE_H
typedef int ElementType;
struct TreeNode
{
ElementType data;
struct TreeNode *left;
struct TreeNode *right;
int height;
};
typedef struct TreeNode TreeNode;
typedef TreeNode *Tree; Tree Find(ElementType e,Tree t);
Tree Insert(ElementType e,Tree t);
Tree Create();
//int Destroy();//这个没写。。。自己写下吧
Tree LeftRotate(Tree t);
Tree RightRotate(Tree t);
int Height(Tree t);
void Show(Tree t);
#endif
//AVLTree.cpp
#include <stdlib.h>
#include <stdio.h>
#include "AVLTree.h"
#define MAX(a,b) ((a)>(b)?(a):(b))
Tree Create()
{
Tree t=(Tree)malloc(sizeof(TreeNode));
if(NULL==t)
{
printf("内存分配错误\n");
return NULL;
}
t->data=;
t->left=NULL;
t->right=NULL;
t->height=;
return t;
}
Tree Find(ElementType e,Tree t)
{
if(NULL==t)
return NULL;
if(e==t->data)
return t;
else if(e>t->data)
return Find(e,t->right);
else
return Find(e,t->left);
}
int Height(Tree t)
{
if(NULL==t)
return -;
else
return t->height;
}
Tree LeftRotate(Tree t)
{ if(NULL==t)
return NULL;
Tree newtree=t->right;
t->right=newtree->left;
newtree->left=t;
t->height=MAX(Height(t->left),Height(t->right))+;
newtree->height=MAX(Height(newtree->left),Height(newtree->right))+;
return newtree;
} Tree RightRotate(Tree t)
{
if(NULL==t)
return NULL;
Tree newtree=t->left;
t->left=newtree->right;
newtree->right=t;
t->height=MAX(Height(t->left),Height(t->right))+;
newtree->height=MAX(Height(newtree->left),Height(newtree->right))+;
return newtree;
} Tree Insert(ElementType e,Tree t)
{
if(NULL==t)
{
Tree first=(Tree)malloc(sizeof(TreeNode));
if(NULL==first)
{
printf("内存分配错误\n");
return NULL;
}
first->left=NULL;
first->right=NULL;
first->height=;
first->data=e;
return first;
}
if(e==t->data)
{
printf("元素已存在\n");
return t;
}
if(e>t->data)
{
t->right=Insert(e,t->right);
int left=Height(t->left);
int right=Height(t->right);
if(right-left==)
if (e<t->right->data)
{
t->right=RightRotate(t->right);
t=LeftRotate(t);
}
else
t=LeftRotate(t);
}
else
{
t->left=Insert(e,t->left);
int left=Height(t->left);
int right=Height(t->right);
if(left-right==)
if (e>t->left->data)
{
t->left=LeftRotate(t->left);
t=RightRotate(t);
}
else
t=RightRotate(t);
}
t->height=MAX(Height(t->left),Height(t->right))+;
return t;
}
void Show(Tree t)
{
if(t==NULL)
return;
Show(t->left);
printf("%d ",t->data);
Show(t->right); return;
}
平衡二叉搜索树/AVL二叉树 C实现的更多相关文章
- 看动画学算法之:平衡二叉搜索树AVL Tree
		
目录 简介 AVL的特性 AVL的构建 AVL的搜索 AVL的插入 AVL的删除 简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜 ...
 - 平衡二叉搜索树AVL
		
package com.sunshine.AlgorithmTemplate; import com.sunshine.OFFER66_SECOND.BalanceTreeNode; import c ...
 - 二叉搜索树、AVL平衡二叉搜索树、红黑树、多路查找树
		
1.二叉搜索树 1.1定义 是一棵二叉树,每个节点一定大于等于其左子树中每一个节点,小于等于其右子树每一个节点 1.2插入节点 从根节点开始向下找到合适的位置插入成为叶子结点即可:在向下遍历时,如果要 ...
 - 手写AVL平衡二叉搜索树
		
手写AVL平衡二叉搜索树 二叉搜索树的局限性 先说一下什么是二叉搜索树,二叉树每个节点只有两个节点,二叉搜索树的每个左子节点的值小于其父节点的值,每个右子节点的值大于其左子节点的值.如下图: 二叉搜索 ...
 - 树-二叉搜索树-AVL树
		
树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...
 - LeetCode 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树
		
第108题 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10 ...
 - convert sorted list to binary search tree(将有序链表转成平衡二叉搜索树)
		
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
 - 算法:非平衡二叉搜索树(UnBalanced Binary Search Tree)
		
背景 很多场景下都需要将元素存储到已排序的集合中.用数组来存储,搜索效率非常高: O(log n),但是插入效率比较低:O(n).用链表来存储,插入效率和搜索效率都比较低:O(n).如何能提供插入和搜 ...
 - 数据结构-二叉搜索树和二叉树排序算法(python实现)
		
今天我们要介绍的是一种特殊的二叉树--二叉搜索树,同时我们也会讲到一种排序算法--二叉树排序算法.这两者之间有什么联系呢,我们一起来看一下吧. 开始之前呢,我们先来介绍一下如何创建一颗二叉搜索树. 假 ...
 
随机推荐
- vue中模块局部刷新
			
父组件: 一. 父组件中引入子组件 data中定义变量 二. 定义provide函数 三.写reload方法 需要刷新的那个子组件: 一.引入 ...
 - day23:单继承&多继承&菱形继承&__init__魔术方法
			
1.单继承 1.1 关于继承的一些基本概念 1.2 子类可以调用父类的公有成员 1.3 子类无法调用父类的私有成员 1.4 子类可以改写父类的方法 2.多继承 2.1 多继承的基本语法 2.2 sup ...
 - Java 的几种运算符
			
一.原码.反码.补码 1 用二进制表示 00000001 -1 如果只变符号位(原码) 10000001 那么 1 + -1 = 10000010 = -2 -1 的反码 11111110 除去符号位 ...
 - GitLab 数据库
			
访问 GitLab 数据库 步骤 用的 Docker Gitlab,首先进入容器 docker exec -it gitlab /bin/bash `` 找到数据库配置文件 ```bash /var/ ...
 - Java基础—继承
			
继承是面向对象的核心特征之一,是由已有类创建新类的机制.利用继承机制,可以先创建一个具有共性的一般类,然后根据该一般类创建具有特殊性的新类,新类继承一般类的属性和方法,并根据需要增加自己的新属性和方法 ...
 - 极简 Node.js 入门 - 2.1 Path
			
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
 - C#LeetCode刷题之#258-各位相加(Add Digits)
			
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3860 访问. 给定一个非负整数 num,反复将各个位上的数字相加 ...
 - drop、truncate、delete功能介绍和三者间区别
			
一.delete 1.delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表 ...
 - 对java程序员来说时间格式永远让人挠头来看Java Date Time 教程-时间测量
			
在Java中,用System.currentTimeMillis()来测量时间最方便. 你要做的是在某些操作之前获取到时间,然后在这些操作之后你想要测量时间,算出时间差.下面是一个例子: long s ...
 - Nordic52840SDK学习之定时器
			
Nordic 52840 SDK学习之定时器 今天开始学习52840SDK,特在此处记录学习内容,防止以后忘记,或许可以给以后的初学者提供一些帮助.如有错误,请发邮件至843036544@qq.com ...