代码如下:

typedef struct AVLNode *Position;
typedef Position AVLTree; /* AVL树类型 */
struct AVLNode{ElementType Data; /* 结点数据 */AVLTree Left;     /* 指向左子树 */AVLTree Right;    /* 指向右子树 */int Height;       /* 树高 */
};int Max ( int a, int b )
{return a > b ? a : b;
}AVLTree SingleLeftRotation ( AVLTree A )
{ /* 注意:A必须有一个左子结点B *//* 将A与B做左单旋,更新A与B的高度,返回新的根结点B */     AVLTree B = A->Left;A->Left = B->Right;B->Right = A;A->Height = Max( GetHeight(A->Left), GetHeight(A->Right) ) + 1;B->Height = Max( GetHeight(B->Left), A->Height ) + 1;return B;
}AVLTree DoubleLeftRightRotation ( AVLTree A )
{ /* 注意:A必须有一个左子结点B,且B必须有一个右子结点C *//* 将A、B与C做两次单旋,返回新的根结点C *//* 将B与C做右单旋,C被返回 */A->Left = SingleRightRotation(A->Left);/* 将A与C做左单旋,C被返回 */return SingleLeftRotation(A);
}/*************************************/
/* 对称的右单旋与右-左双旋请自己实现 */
/*************************************/AVLTree Insert( AVLTree T, ElementType X )
{ /* 将X插入AVL树T中,并且返回调整后的AVL树 */if ( !T ) { /* 若插入空树,则新建包含一个结点的树 */T = (AVLTree)malloc(sizeof(struct AVLNode));T->Data = X;T->Height = 0;T->Left = T->Right = NULL;} /* if (插入空树) 结束 */else if ( X < T->Data ) {/* 插入T的左子树 */T->Left = Insert( T->Left, X);/* 如果需要左旋 */if ( GetHeight(T->Left)-GetHeight(T->Right) == 2 )if ( X < T->Left->Data ) T = SingleLeftRotation(T);      /* 左单旋 */else T = DoubleLeftRightRotation(T); /* 左-右双旋 */} /* else if (插入左子树) 结束 */else if ( X > T->Data ) {/* 插入T的右子树 */T->Right = Insert( T->Right, X );/* 如果需要右旋 */if ( GetHeight(T->Left)-GetHeight(T->Right) == -2 )if ( X > T->Right->Data ) T = SingleRightRotation(T);     /* 右单旋 */else T = DoubleRightLeftRotation(T); /* 右-左双旋 */} /* else if (插入右子树) 结束 *//* else X == T->Data,无须插入 *//* 别忘了更新树高 */T->Height = Max( GetHeight(T->Left), GetHeight(T->Right) ) + 1;return T;
}

AVL树的旋转与插入(C语言)相关推荐

  1. c++《AVL树的概念》《AVL树的插入》《AVL树的旋转》《AVL树的验证》《AVL树的删除》《AVL树的性能》

    4.1 AVL树 4.1.1 AVL树的概念 二叉搜索树虽可以缩短查找的效率,**但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当 于在顺序表中搜索元素,效率低下.**因此,两位俄罗斯的 ...

  2. AVL树平衡旋转详解

    AVL树平衡旋转详解 概述 AVL树又叫做平衡二叉树.前言部分我也有说到,AVL树的前提是二叉排序树(BST或叫做二叉查找树).由于在生成BST树的过程中可能会出现线型树结构,比如插入的顺序是:1, ...

  3. (C语言) AVL树 - 自平衡二叉树:插入、删除

    数组a[9] = {4,2,6,1,3,5,7,16,15}; 说明:1.层序遍历AVL树,括号内为每个节点的高度值 2.第二行为删除节点"5"之后的AVL树 Reference: ...

  4. 数据结构-----AVL树的旋转操作

    本文主要讲解AVL的旋转操作,供自己复习用,如有不对之处请指出.另外图片是从链接处的大神那复制的,感觉文章写的很好,可以去学习. http://www.cnblogs.com/QG-whz/p/516 ...

  5. 平衡二叉树之AVL树的旋转

    平衡二叉树是基于二叉排序树(或者也叫二叉搜索树)实现的一种自平衡的二叉树,实现方法有比如:AVL树.红黑树等等 二叉搜索树定义(维基百科): 二叉查找树(英语:Binary Search Tree), ...

  6. 数据结构--Avl树的创建,插入的递归版本和非递归版本,删除等操作

    AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值最多为1(空树的高度为-1). 也就是说,AVL树,本质上是带了平 ...

  7. 实现平衡二叉树(AVL树)的旋转

    给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在. 左边 BST 存在的问题分析:               1) 左子树全部为空,从形式上看,更像一个单链 ...

  8. AVL树C++实现(插入,删除,查找,清空,遍历操作)

    AVL.h文件代码 #pragma once #include<iostream> #include<stack>#include <assert.h> using ...

  9. 树的四种遍历案例和AVL树的旋转的四种情况

    树与二叉树 一, 树的基本术语 树中一个结点的子结点个数称为该结点的度, 树中结点的最大度数称为树的度.如结点B的度为2,结点D的度为3,树的度为3. 度大于0的结点称为分支结点(又称非终端结点),度 ...

最新文章

  1. JTA 深度历险 - 原理与实现---转
  2. how is Bean object created
  3. Android实现监测网络状态
  4. 一个两年Java的面试总结
  5. spring :cannot be resolved to absolute file path because it does not reside in the file system: jar
  6. Julia:提高性能的N个点
  7. 数据库范式那些事[转]
  8. 刚才读《基于Lucene的中文自然语言搜索引擎》后感
  9. Win10使用以前的图片查看器
  10. MongoDB学习笔记之索引(一)
  11. vue开发企业微信应用-开发及调试方式
  12. 道德经 道可道,非常道。
  13. 她笔下的水墨世界令人赞叹,中国风海报沉浸式国风体验
  14. VirtualBox免费虚拟机使用简介、3G无线上网的Virtualbox实现
  15. kubectl describe命令详解
  16. 微信录音功能在哪里?图文教学,轻松学会微信隐藏技能
  17. 2022年自考专业(公关关系)传播学概论练习题
  18. Android 打造形形色色的进度条 实现可以如此简单
  19. 通付盾再获区块链密码发明专利授权,区块链密码落地显实效
  20. 2021赣一中高考成绩查询,2021江西省十大重点高中排名

热门文章

  1. C语言试题三十三之比较两个字符串的长度,(不得调用c语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。
  2. linux c之perror和exit使用总结
  3. Linux之软连接和硬链接
  4. C++ throw:抛出自己的异常
  5. Android之使用PopupWindow使用和总结
  6. Android之matrix类控制图片的旋转、缩放、移动
  7. html三列布局源码,HTML三列布局 - 黄柳淞的个人页面 - OSCHINA - 中文开源技术交流社区...
  8. 忍“乳”负重,身材好的女孩子究竟有多不容易?我从科学的角度算出来了……...
  9. 为什么女生会有体香?
  10. 厉害了!这里藏着通关学霸的秘籍