平衡二叉搜索树/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实现)
今天我们要介绍的是一种特殊的二叉树--二叉搜索树,同时我们也会讲到一种排序算法--二叉树排序算法.这两者之间有什么联系呢,我们一起来看一下吧. 开始之前呢,我们先来介绍一下如何创建一颗二叉搜索树. 假 ...
随机推荐
- 003_go语言中的变量
代码演示: package main import "fmt" func main() { var a = "initial" fmt.Println(a) v ...
- cxuan读者的外包面试之旅
最开始是打算面试外包公司刷经验,等经验差不多了,再去甲方尝试,可惜不太顺利. 一.迈思(面试了30分钟) 自我介绍 左连接(a 表左连接 b 表,a 表全部数据出来,b 表没有的数据为空) a 表左连 ...
- WebMvcConfigurerAdapter在2.x向上过时问题
在spring boot2.x向上,书写配置类时集成的WebMvcConfigurerAdapter会显示此类已经过时. 解决:不继承WebMvcConfigurerAdapter类,该实现WebMv ...
- Java 多态 接口继承等学习笔记
Super关键字 1.子类可以调用父类声明的构造方法 : 语法:在子类的构造方法中使用super关键字 super(参数列表) 2.操作被隐藏的成员变量(子类的成员变量和父类的成员变量重名的说法)和 ...
- ExtremeNet
- 【MySQL】如何最大程度防止人为误操作MySQL数据库?这次我懂了!!
写在前面 今天,一位哥们打电话来问我说误操作了他们公司数据库中的数据,如何恢复.他原本的想法是登录数据库update一个记录,结果忘了加where条件,于是悲剧发生了.今天,我们不讲如何恢复误操作的数 ...
- 2020-04-28:工作中如何解决MQ消息堆积和消息重复的问题?
福哥答案2020-04-28:此答案来自群员,感谢群员支持. 消息堆积 只能考虑 增多消费者 以及后端其他服务 组件的吞吐能力 别的有办法吗 如果更彻底一点 分撒单个队列里的消息 队列 更分门别类 或 ...
- generate_fixed_frame()方法生成Java方法栈帧
在从generate_normal_entry()函数调用generate_fixed_frame()函数时的栈与寄存器的状态如下: 栈的状态如下图所示. 各个寄存器的状态如下所示. rax: ret ...
- 一个@Transaction哪里来这么多坑?
前言 在之前的文章中已经对Spring中的事务做了详细的分析了,这篇文章我们来聊一聊平常工作时使用事务可能出现的一些问题(本文主要针对使用@Transactional进行事务管理的方式进行讨论)以及对 ...
- 初入Shell
shell 第1章 Shell概述 大数据程序员为什么要学习Shell呢? 1)需要看懂运维人员编写的Shell程序. 2)偶尔会编写一些简单Shell程序来管理集群.提高开发效率. 第2章 Shel ...