AVL树
来源:互联网 发布:nginx cgi 编辑:程序博客网 时间:2024/05/19 07:42
参考资料:
http://blog.csdn.net/xiaofan086/article/details/8294382
<数据结构与算法分析>-C语言描述 Mark Allens Weiss
承接上个二叉查找树:
/* * avl.h * * Created on: 2016年4月3日 * Author: fay */#ifndef AVL_H_#define AVL_H_#include <stdio.h>#include <stdlib.h>typedef int ElementType;//以下定义Avl树的节点typedef struct TreeNode{ ElementType data; struct TreeNode * left;//定义左孩子 struct TreeNode * right;//定义右孩子 int height;}*Position,*AvlTree;AvlTree MakeEmpty(AvlTree T);/*以下定义树查找操作,找到最大,最小元素*/Position Find(ElementType x,AvlTree T );Position FindMax(AvlTree T);Position FindMin(AvlTree T);/*以下定义树的插入,删除,返回指定位置的元素*/AvlTree Insert(ElementType x,AvlTree T );AvlTree Delete(ElementType x,AvlTree T );ElementType Retrieve(Position T);/*定义返回树的高度*/static int Height(AvlTree T);/*中序遍历二叉树*/void InOrderRecur(AvlTree T);#endif /* AVL_H_ *//* * avlTree.c * * Created on: 2016年4月3日 * Author: fay */#include "avl.h"AvlTree MakeEmpty(AvlTree T) { if (T != 0) { MakeEmpty(T->left); MakeEmpty(T->right); free(T); } return 0;}Position Find(ElementType X, AvlTree T) { if (T == 0) { return 0; } if (X < T->data) { return Find(X, T->left); } else if (X > T->data) { return Find(X, T->right); } else { return T; }}Position FindMax(AvlTree T) { if (T == 0) { return 0; } else if (T->right != 0) { return FindMax(T->right); } else { return T; }}Position FindMin(AvlTree T) { if (T == 0) { return 0; } else if (T->left != 0) { return FindMin(T->left); } else { return T; }}ElementType Retrieve(Position T) { return T->data;}static int Max(int h1, int h2) { return h1 > h2 ? h1 : h2;}static int Height(Position T) { if (T == 0) { return -1; } else { return T->height; }}static Position SingleRotateWithLeft(Position K2){ Position 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),Height(K2->right))+1; return K1;}static Position SingleRotateWithRight(Position K1){ Position K2; K2=K1->right; K1->right=K2->left; K2->left=K1; K1->height=Max(Height(K1->left),Height(K1->right))+1; K2->height=Max(Height(K1->left),Height(K2->right))+1; return K1;}static Position DoubleRotateWithLeftRight(Position K3){ Position K1=K3->left; K3->left=SingleRotateWithRight(K1); return SingleRotateWithLeft(K3);}static Position DoubleRotateWithRightLeft(Position K1){ Position K3=K1->right; K1->right=SingleRotateWithLeft(K3); return SingleRotateWithRight(K1);}/*插入节点需要注意平衡二叉树,任意节点的左右子树的高度差不得大于1*/AvlTree Insert(ElementType X, AvlTree T) { //树等于空的情形 if (T == 0) { T = (AvlTree) malloc(sizeof(struct TreeNode)); if (T == 0) { } else { T->data = X; T->height = 0; T->left = T->right = 0; } } else if (X < T->data) { //插入节点需要判断左右子树的高度 T->left = Insert(X, T->left); if (Height(T->left) - Height(T->right) == 2) { //左左的情形,单旋转 if (X < T->left->data) { T = SingleRotateWithLeft(T); } else { //左右双旋转 T = DoubleRotateWithLeftRight(T); } } } else if (X > T->data) { T->right = Insert(X, T->right); if (Height(T->left) - Height(T->right) == 2) { //右右的情形,单旋转 if (X < T->left->data) { T = SingleRotateWithRight(T); } else { //右左双旋转 T = DoubleRotateWithRightLeft(T); } } } T->height = Max(Height(T->left), Height(T->right)) + 1; return T;}AvlTree Delete(ElementType X, AvlTree T) { Position temp; if (T == 0) { return 0; } else if (X < T->data) { printf(" X < T->data %d ", T->data); T->left = Delete(X, T->left); } else if (X > T->data) { T->right = Delete(X, T->right); printf(" X > T->data %d ", T->data); } /*以下为找到了要删除的节点分为三种情况*/ else if (T->left && T->right) { //要删除的节点有左儿子和右儿子 printf("X == T->data %d", T->data); temp = FindMin(T->right); printf("FindMin %d", temp->data); T->data = temp->data; //好难理解 妹滴 T->right = Delete(T->data, temp->right); } else { //只有一个儿子或没有儿子 temp = T; if (T->left == 0) { T = T->right; } else if (T->right == 0) { T = T->left; } free(temp); } return T;}/* * 中序遍历输出 */void InOrderRecur(AvlTree T) { static int n = 0; if (0 != T) { InOrderRecur(T->left); printf("%d \n", T->data); InOrderRecur(T->right); }}/** * 先根遍历 */void PreOrderRecur(AvlTree T) { static int n = 0; if (0 != T) { printf("%d \n", T->data); PreOrderRecur(T->left); PreOrderRecur(T->right); }}/* * functionAvl.c * * Created on: 2016年4月3日 * Author: fay */#include"avlTree.c"#define N 15int main(void) { AvlTree T=0; int i; int j = 0; T = MakeEmpty(0 ); for( i = 0; i < N; i++, j = ( j + 7 ) % 50 ) { printf("j=%d \n",j); T = Insert( j, T ); } // puts("插入 4 \n"); // T = Insert( 4, T ); InOrderRecur(T); printf("================"); printf("height=%d \n",T->height); InOrderRecur(T); printf( "Min is %d, Max is %d\n", Retrieve( FindMin( T ) ), Retrieve( FindMax( T ) ) ); return EXIT_SUCCESS;}
0 0
- AVL树
- AVL树
- AVL树
- avl树
- AVL树
- avl树
- AVL树
- AVL树
- AVL树
- AVL树
- avl树
- avl树
- AVL树
- AVL树
- AVL树
- AVL树
- AVL 树
- AVL树
- Swift函数柯里化(Currying)简谈
- [动态树 LCT] BZOJ 2157 旅游
- JBOSS安装配置并搭建本地开发环境
- 求最长回文子串,O(n)复杂度
- Android编程学习笔记 之 SQLite数据存储
- AVL树
- Linux下virtualbox 升级后1908错误,sudo: /etc/init.d/vboxdrv:找不到命令
- 会做题的兔兔——重大4月月赛
- C++ vector::resize
- c语言中宏定义和函数区别
- Android Gradle Plugin指南(一)——简介
- C/C++—— C++编译器是如何实现多态
- InSAR学习(五)高级的InSAR技术:PS技术和SBAS技术
- ImageSwither、Gallery的简单用法