平衡二叉搜索树/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实现)
今天我们要介绍的是一种特殊的二叉树--二叉搜索树,同时我们也会讲到一种排序算法--二叉树排序算法.这两者之间有什么联系呢,我们一起来看一下吧. 开始之前呢,我们先来介绍一下如何创建一颗二叉搜索树. 假 ...
随机推荐
- Java web 小测验
题目要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分) 3性别:要求用单 ...
- JS DOM重点核心笔记
DOM重点核心 文档对象模型,是W3C推荐的处理可扩展的标记语言的标准编程接口 我们主要针对与勇士的操作,主要有创建.增加.删除.修改.查询.属性操作.事件操作 三种动态创建元素的 ...
- 基于OpenSIPS做注册服务下,场景A打B,一方发起BYE挂断后收到500,另一方无法挂断的问题
基于OpenSIPS做注册服务下,场景A打B,一方发起BYE挂断后收到500,另一方无法挂断的问题 最近在工作中遇到一个看似很奇怪的,排除起来很费劲,但最后的解决方式又及其简单的问题,下面我们 ...
- C#设计模式之18-备忘录模式
备忘录模式(Memento Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/421 访问. 备忘录模式属 ...
- Linux内核之 内核同步
上文我们介绍过进程调度,Linux内核从2.6版本开始支持内核抢占,所以内核很多代码也需要同步保护. 一.同步介绍 1.临界区与竞争条件 所谓临界区(critical regions)就是访问和操作共 ...
- AS 新安装Android Studio运行项目前报错:Unable to access Android SDK add-on list
新安装Android Studio运行项目前报错:Unable to access Android SDK add-on list AS启动后,会在默认路径下检测是否有Android SDK,如果没有 ...
- C++类和对象的封装 点和圆的案例
主要练习 :在类中可以让另一个类作为本类的成员. 案例:判断点和圆的位置关系. 一.第一种直接方法 using namespace std; #include <iostream> cla ...
- 笔记:html基础
一.HTML:超文本标记语言,是一种标签语言,不是编程语言,显示数据有双标签<body></body> 和单标签<img src=# / >, 标签大小写都可以 通 ...
- Spark中遇到的问题
spark启动slave时提示 JAVA_HOME is not set 解决方法: 在sbin目录spark-config.sh 中添加自己的jdk 路径export JAVA_HOME=/home ...
- golang并发
1.goroutine goroutine是Go并行设计的核心.goroutine说到底其实就是线程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些 ...