平衡二叉搜索树/AVL二叉树 C实现

//AVTree.h

 1 #ifndef MY_AVLTREE_H
 2 #define MY_AVLTREE_H
 3 typedef int ElementType;
 4 struct TreeNode
 5 {
 6     ElementType data;
 7     struct TreeNode *left;
 8     struct TreeNode *right;
 9     int height;
10 };
11 typedef struct TreeNode TreeNode;
12 typedef TreeNode *Tree;
13
14 Tree Find(ElementType e,Tree t);
15 Tree Insert(ElementType e,Tree t);
16 Tree Create();
17 //int Destroy();//这个没写。。。自己写下吧
18 Tree LeftRotate(Tree t);
19 Tree RightRotate(Tree t);
20 int Height(Tree t);
21 void Show(Tree t);
22 #endif

//AVLTree.cpp

  1 #include <stdlib.h>
  2 #include <stdio.h>
  3 #include "AVLTree.h"
  4 #define MAX(a,b) ((a)>(b)?(a):(b))
  5 Tree Create()
  6 {
  7     Tree t=(Tree)malloc(sizeof(TreeNode));
  8     if(NULL==t)
  9     {
 10         printf("内存分配错误\n");
 11         return NULL;
 12     }
 13     t->data=0;
 14     t->left=NULL;
 15     t->right=NULL;
 16     t->height=0;
 17     return t;
 18 }
 19 Tree Find(ElementType e,Tree t)
 20 {
 21     if(NULL==t)
 22         return NULL;
 23     if(e==t->data)
 24         return t;
 25     else if(e>t->data)
 26         return Find(e,t->right);
 27     else
 28         return Find(e,t->left);
 29 }
 30 int Height(Tree t)
 31 {
 32     if(NULL==t)
 33         return -1;
 34     else
 35         return t->height;
 36 }
 37 Tree LeftRotate(Tree t)
 38 {
 39
 40     if(NULL==t)
 41         return NULL;
 42     Tree newtree=t->right;
 43     t->right=newtree->left;
 44     newtree->left=t;
 45     t->height=MAX(Height(t->left),Height(t->right))+1;
 46     newtree->height=MAX(Height(newtree->left),Height(newtree->right))+1;
 47     return newtree;
 48 }
 49
 50 Tree RightRotate(Tree t)
 51 {
 52     if(NULL==t)
 53         return NULL;
 54     Tree newtree=t->left;
 55     t->left=newtree->right;
 56     newtree->right=t;
 57     t->height=MAX(Height(t->left),Height(t->right))+1;
 58     newtree->height=MAX(Height(newtree->left),Height(newtree->right))+1;
 59     return newtree;
 60 }
 61
 62 Tree Insert(ElementType e,Tree t)
 63 {
 64     if(NULL==t)
 65     {
 66         Tree first=(Tree)malloc(sizeof(TreeNode));
 67         if(NULL==first)
 68         {
 69             printf("内存分配错误\n");
 70             return NULL;
 71         }
 72         first->left=NULL;
 73         first->right=NULL;
 74         first->height=0;
 75         first->data=e;
 76         return first;
 77     }
 78     if(e==t->data)
 79         {
 80             printf("元素已存在\n");
 81             return t;
 82         }
 83     if(e>t->data)
 84     {
 85         t->right=Insert(e,t->right);
 86         int left=Height(t->left);
 88         int right=Height(t->right);
 90         if(right-left==2)
 91             if (e<t->right->data)
 92             {
 93                 t->right=RightRotate(t->right);
 94                 t=LeftRotate(t);
 95             }
 96             else
 97                 t=LeftRotate(t);
 98     }
 99     else
100     {
101         t->left=Insert(e,t->left);
102         int left=Height(t->left);
104         int right=Height(t->right);
106         if(left-right==2)
107             if (e>t->left->data)
108             {
109                 t->left=LeftRotate(t->left);
110                 t=RightRotate(t);
111             }
112             else
113                 t=RightRotate(t);
114     }
115     t->height=MAX(Height(t->left),Height(t->right))+1;
116     return t;
117 }
118 void Show(Tree t)
119 {
120     if(t==NULL)
121         return;
122     Show(t->left);
123     printf("%d ",t->data);
124     Show(t->right);
125
126     return;
127 }
时间: 2024-12-24 21:15:41

平衡二叉搜索树/AVL二叉树 C实现的相关文章

平衡二叉搜索树(AVL树,红黑树)数据结构和区别

平衡二叉搜索树(Balanced Binary Search Tree) 经典常见的自平衡的二叉搜索树(Self-balancing Binary Search Tree)有 ① AVL树 :Windows NT 内核中广泛使用 ② 红黑树:C++ STL(比如 map.set )Java 的 TreeMap.TreeSet.HashMap.HashSet  Linux 的进程调度  Ngix 的 timer 管理 1 AVL树  vs  红黑树 ①AVL树 平衡标准比较严格:每个左右子树的高度

平衡二叉搜索树(AVL树)的原理及实现源代码(有图文详解和C++、Java实现代码)

一.AVL树(平衡二叉搜索树)是什么? AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的.AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个非叶子结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 例如: 5             5 / \            /  \ 2   6         2   6 / \    \         / \ 1  4   7       1  4

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

【算法学习】AVL平衡二叉搜索树原理及各项操作编程实现(C语言)

#include<stdio.h> #include "fatal.h" struct AvlNode; typedef struct AvlNode *Position; typedef struct AvlNode *AvlTree; typedef int ElementType ; AvlTree MakeEmpty(AvlTree T); Position Find(ElementType X,AvlTree T); Position FindMin(AvlTre

平衡二叉搜索树

AVL树又称高度平衡的二叉搜索树,是1962年俄罗斯的数学家提出来的.它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度. AVL的性质: (1)左子树和右子树的高度之差的绝对值不超过1. (2)树中的每个左子树和右子树都是AVL树. (3)每个节点都有一个平衡因子,任一节点的平衡因子是-1,0,1(每个节点的平衡因子等于右子树的高度减去左子树的高度). 代码实现如下: #include<iostream> using namespace std; template<c

二叉搜索树(排序二叉树)

完整代码:插入,查找,删除 struct BST { int val; BST *lch, *rch; BST *insert(BST *p, int x) { if (p == NULL) { BST *t = new BST; //new出来的不是指向NULL的 t->val = x; t->lch = t->rch = NULL; return t; } if (x <= p->val) p->lch = insert (p->lch, x); else p

数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: BST树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中: 如果BST树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树 的搜索性能逼近二分查找:但它比连续内存空间的二分查找的优点是,改变BST树结构 插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销: 如:

算法二叉搜索树之AVL树

最近学习了二叉搜索树中的AVL树,特在此写一篇博客小结. 1.引言 对于二叉搜索树而言,其插入查找删除等性能直接和树的高度有关,因此我们发明了平衡二叉搜索树.在计算机科学中,AVL树是最先发明的自平衡二叉搜索树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.对于N个节点的AVL树,由于树高被限制为lgN,因此其插入查找删除操作耗时为O(lgN). 2.旋转 在讲解关键步骤插入与删除以前,首先我们先定义一些辅助用的操作:旋转.旋转分为左旋和右旋,其示意图如下: 相信上

二叉搜索树的局限性

-------------------siwuxie095 二叉搜索树的局限性 二叉搜索树在时间性能上是具有局限性的 同样的数据,可以对应不同的二叉搜索树,如下: 二叉搜索树可能退化成链表,相应的,二叉搜索树的查找操作是和这棵树 的高度相关的,而此时这颗树的高度就是这颗树的节点数 n,同时二叉搜 索树相应的算法全部退化成 O(n) 级别 显然,说二叉搜索树的查找.插入.删除 这三个操作都是 O(lgn) 级别的, 只是一个大概的估算,具体要和二叉搜索树的形状相关 二叉搜索树并不能像堆那样,保证所