二叉平衡树(AVL):

  这个数据结构我在三月份学数据结构结构的时候遇到过。但当时没调通。也就没写下来。前几天要用的时候给调好了!详细AVL是什么,我就不介绍了,维基百科都有。

 后面两月又要忙了。和同学组队去比赛,预计博客这边也不常写了。等这段时间过了再继续更新!

 这是我第一次画电路图(原理图)晒晒,事实上我对电子非常感兴趣的。看着网上人家做的电子作品。就想自己也做做。兴奋的想试试。呵呵,以后我做电子小作品了也把他放到博客,开源和大家一起分享。DIY的乐趣。

 

 

 

第一次正儿八经会电路图,别笑啊!

 

/*------------------------------------------------------------------------------------
* Project: AVLTree.h
* Name: zwp
* Date: 2014/3
*------------------------------------------------------------------------------------*/ #ifndef AVLTREE_H_
#define AVLTREE_H_ typedef int ElementType; typedef struct AvlNode
{
ElementType Element;
AvlNode* Left;
AvlNode* Right;
int Height; }*AvlTree; /*
** 初始化
*/
AvlTree Initialize(void); /*
** 遍历树
*/
void Traverse(AvlTree H); /*
** 清空元素
*/
void MakeEmpty(AvlTree H); /*
** 寻找元素
*/
AvlTree Find(ElementType X, AvlTree T); /*
** 找最大
*/
AvlTree FindMax(AvlTree T); /*
** 找最小
*/
AvlTree FindMin(AvlTree T); /*
** 插入元素
*/
AvlTree Insert(ElementType X, AvlTree T); /*
** 删除元素
*/
AvlTree Delete(ElementType X, AvlTree T); #endif

 

/*-----------------------------------------------------------------------------
* Project: AVLTree.cpp
* Name: zwp
* Date: 2014/3
*------------------------------------------------------------------------------*/ #include "AVLTree.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h> /*
** 返回树的高度
*/
static int Height(AvlTree P)
{
if(P == NULL)
return -1;
else
return P->Height;
} /*
** 返回最大值
*/
int Max(int num1, int num2)
{
return ((num1 > num2) ? num1 : num2);
} /*
** 右旋转
*/
static AvlTree SingleRotateWithLeft(AvlTree K2)
{
AvlTree K1; K1 = K2->Left;
K2->Left = K1->Right;
K1->Right = K2; K2->Height = Max(Height(K2->Left), Height(K2->Right)) + 1; K1->Height = Max(Height(K1->Left), K2->Height) + 1; return K1; } /*
** 左旋转
*/
static AvlTree SingleRotateWithRight(AvlTree K2)
{
AvlTree K1; K1 = K2->Right;
K2->Right = K1->Left;
K1->Left = K2; K2->Height = Max(Height(K2->Left), Height(K2->Right)) + 1;
K1->Height = Max(Height(K1->Right), K2->Height) + 1; return K1;
} /*
** 右双旋转
*/
static AvlTree DoubleRotateWithLeft(AvlTree K3)
{
/* Rotate between K1 and K2
* K2 Left Rotate
*/
K3->Left = SingleRotateWithRight(K3->Left); /* Rotate between K3 and K2
* K2 Right Rotate
*/
return SingleRotateWithLeft(K3); } /*
** 左双旋转
*/
static AvlTree DoubleRotateWithRight(AvlTree K3)
{
/* Rotate between K1 and K2
* K2 Right Rotate
*/
K3->Right = SingleRotateWithLeft(K3->Right); /* Rotate between K3 and K2
* K2 Left Rotate
*/
return SingleRotateWithRight(K3); } AvlTree Insert(ElementType X, AvlTree T)
{
if(T == NULL)
{
/* Create and return a one-node tree */
T = (AvlTree)malloc(sizeof(struct AvlNode));
if(T == NULL)
printf("Out of space...\n");
else
{
T->Element = X;
T->Height = 0;
T->Left = T->Right = NULL;
} }
else if(X < T->Element) /* 插入树的左子枝 */
{
T->Left = Insert(X, T->Left);
/* 左子树的高度与右子树高度相差2 */
if(Height(T->Left) - Height(T->Right) == 2)
{
if(X < T->Left->Element)
T = SingleRotateWithLeft(T); /* CASE : left-left sing rotate Right */
else
T = DoubleRotateWithLeft(T); /* CASE : left-right double rotate Right */
}
}
else if(X > T->Element) /* 插入树的右子枝 */
{
T->Right = Insert(X, T->Right);
/* 右子树的高度与左子树高度相差2 */
if(Height(T->Right) - Height(T->Left) == 2)
{
if(X > T->Right->Element)
T = SingleRotateWithRight(T); /* CASE: right-right sing rotate Left */
else
T = DoubleRotateWithRight(T); /* CASE: right-left double rotate Left */
}
} /*
* else X is in the tree already
* +1 because root Node
*/
T->Height = Max(Height(T->Left), Height(T->Right)) + 1; return T;
} /*
** 初始化
*/
AvlTree Initialize(void)
{
/* Create and return a one-node tree */
AvlTree T = (AvlNode*)malloc(sizeof( struct AvlNode));
T->Element = 0;
T->Height = 0;
T->Left = T->Right = NULL; return T; } /*
** 寻找元素
*/
AvlTree Find(ElementType X, AvlTree T)
{
if(T == NULL)
return NULL;
if(X < T->Element)
return Find(X, T->Left);
else if(X > T->Element)
return Find(X, T->Right);
else
return T;
} /*
** 找最大
*/
AvlTree FindMax(AvlTree T)
{
ElementType max = 0;
AvlTree P = T; /* Find in AVLTree Right */
while(P != NULL)
{
if(max < P->Element)
{
max = P->Element;
P = P->Right;
}
else
P = P->Right;
}
return P;
} /*
** 找最小
*/
AvlTree FindMin(AvlTree T)
{
ElementType min = 0;
AvlTree P = T; while(P != NULL)
{
if(min > P->Element)
{
min = P->Element;
P = P->Left;
}
else
P = P->Left; }
return P;
} /*
** 删除元素
*/
AvlTree Delete(ElementType X, AvlTree T)
{
AvlTree TmpCell; if(T == NULL)
printf("Elememt not found....\n");
else if(X < T->Element)
T->Left = Delete(X, T->Left); /* Go Left */
else if(X > T->Element)
T->Right = Delete(X, T->Right); /* Go Right */
else if(T->Left && T->Right)
{
/*
** Two children
** Replace with smallest in right subtree
*/
TmpCell = FindMin(T->Right);
T->Element = TmpCell->Element;
T->Height = TmpCell->Height;
T->Right = Delete(T->Element, T->Right);
}
else
{
/*
** One or zero children
*/
TmpCell = T;
if(T->Left == NULL)
T = T->Right;
else if(T->Right == NULL)
T = T->Left;
free(TmpCell);
} return T;
} /*
** 清空元素
*/
void MakeEmpty(AvlTree H)
{
if(H != NULL)
{
MakeEmpty(H->Left);
MakeEmpty(H->Right);
free(NULL);
}
} /*
** 遍历树
*/
void Traverse(AvlTree H)
{ if(H != NULL)
{
Traverse(H->Left);
printf("%d \n", H->Element);
Traverse(H->Right);
} }

 

/*-----------------------------------------------------------------------------
* Project: Main.cpp
* Name: zwp
* Date: 2014.3
*------------------------------------------------------------------------------*/ #include "AVLTree.h"
#include <stdio.h>
#include <stdlib.h> int main(int argc, char* argv[])
{ AvlTree T = Initialize(); for(int index = 0; index < 10; ++ index)
T = Insert(index, T); Traverse(T); //printf("%d \n", Find(3, T)); system("pause"); }

 

Algorithms: 二叉平衡树(AVL)的更多相关文章

  1. 二叉平衡树AVL的插入与删除(java实现)

    二叉平衡树 全图基础解释参考链接:http://btechsmartclass.com/data_structures/avl-trees.html 二叉平衡树:https://www.cnblogs ...

  2. (4) 二叉平衡树, AVL树

    1.为什么要有平衡二叉树? 上一节我们讲了一般的二叉查找树, 其期望深度为O(log2n), 其各操作的时间复杂度O(log2n)同时也是由此决定的.但是在某些情况下(如在插入的序列是有序的时候), ...

  3. 树-二叉平衡树AVL

    基本概念 AVL树:树中任何节点的两个子树的高度最大差别为1. AVL树的查找.插入和删除在平均和最坏情况下都是O(logn). AVL实现 AVL树的节点包括的几个组成对象: (01) key -- ...

  4. java项目---用java实现二叉平衡树(AVL树)并打印结果(详)(3星)

    package Demo; public class AVLtree { private Node root; //首先定义根节点 private static class Node{ //定义Nod ...

  5. AVL树(二叉平衡树)详解与实现

    AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树.这个平衡条件必 ...

  6. 从零开始学算法---二叉平衡树(AVL树)

    先来了解一些基本概念: 1)什么是二叉平衡树? 之前我们了解过二叉查找树,我们说通常来讲, 对于一棵有n个节点的二叉查找树,查询一个节点的时间复杂度为log以2为底的N的对数. 通常来讲是这样的, 但 ...

  7. 看动画学算法之:平衡二叉搜索树AVL Tree

    目录 简介 AVL的特性 AVL的构建 AVL的搜索 AVL的插入 AVL的删除 简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜 ...

  8. 判断一颗二叉树是否为二叉平衡树 python 代码

    输入一颗二叉树,判断这棵树是否为二叉平衡树.首先来看一下二叉平衡树的概念:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.因此判断一颗二叉平衡树的关键在于 ...

  9. 树-二叉搜索树-AVL树

    树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...

随机推荐

  1. SpringCloud+Hystrix服务容错

    Netflix Hystrix — 应对复杂分布式系统中的延时和故障容错 +应用场景 分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为了应对服务雪崩 ...

  2. Android四大组件-Broadcast Receiver

    http://www.jianshu.com/p/1013a366cc72 http://www.jianshu.com/p/ca3d87a4cdf3 前言 基础知识. 1.Android广播分为两个 ...

  3. Java - "JUC" ReentrantLock获取锁

    [Java并发编程实战]-----“J.U.C”:ReentrantLock之一简介 ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”. 顾名思义,R ...

  4. php面向对象精要(1)

    1.静态属性与方法 每一个类的实例拥有自己的属性和方法,每一个类也可以包含静态属性,静态属性不属于类的任何实例,可以把静态属性理解成存储在类中的全局变量,可以在任何地方通过类名引用静态属性. < ...

  5. python学习之老男孩python全栈第九期_day003作业

    1. 有变量name = "aleX leNb" 完成如下操作:(1) 移除 name 变量对应的值两边的空格,并输出处理结果name = ' aleX leNb 'print(n ...

  6. python学习之老男孩python全栈第九期_day008作业

    1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数,求出本次购物花费的总钱数apple 10 3tesla 100000 1mac 3000 2lenovo 30000 3chicken ...

  7. WebSerivce与WebAPI的区别

    一.什么是Web Service Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应 ...

  8. 转 [PHP] - 性能加速 - 开启Opcache

    原文地址:[PHP] - 性能加速 - 开启Opcache PHP7已经发布了, 作为PHP10年来最大的版本升级, 最大的性能升级, PHP7在多放的测试中都表现出很明显的性能提升  一.开启Opc ...

  9. JS获取填报扩展单元格控件的值

    1. 问题描述 填报预览时,我们想获取到某个控件的值相对来说较容易.但如果控件是扩展的,就只能获取到第一个值,无法根据扩展一行行获取对应的值. 例:本意是想获取到袁成洁,结果还是获取到第一个单元格值孙 ...

  10. RecyclerView-- 侧滑删除和拖动排序

    实现这么个功能我们不需要再去继承RecyclerView,只需要去了解ItemTouchHelper这个类即可,接下来我们就去看看都有些什么 ItemTouchHelper.Callback 默认需要 ...