平衡查找树C语言程序,树4. Root of AVL Tree-平衡查找树AVL树的实现
对于一棵普通的二叉查找树而言,在进行多次的插入或删除后,容易让树失去平衡,导致树的深度不是O(logN),而接近O(N),这样将大大减少对树的查找效率。一种解决办法就是要有一个称为平衡的附加的结构条件:任何节点的深度均不得过深。有一种最古老的平衡查找树,即AVL树。
AVL树是带有平衡条件的二叉查找树。平衡条件是每个节点的左子树和右子树的高度最多差1的二叉查找树(空树的高度定义为-1)。相比于普通的二叉树,AVL树的节点需要增加一个变量保存节点高度。AVL树的节点声明如下:
typedef struct TreeNode *AvlTree;
typedefstruct TreeNode *Position;structTreeNode
{intData;
AvlTree Left;
AvlTree Right;int Height; //保存节点高度
};
只有一个节点的树显然是AVL树,之后我们向其插入节点。然而在插入过程中可能破坏AVL树的特性,因此我们需要对树进行简单的修正,即AVL树的旋转。
设a节点在插入下一个节点后会失去平衡,这种插入可能出现四种情况:
1. 对a的左儿子的左子树进行一次插入。(左-左)
2. 对a的左儿子的右子树进行一次插入。(左-右)
3. 对a的右儿子的左子树进行一次插入。(右-左)
4. 对a的右儿子的右子树进行一次插入。(右-右)
情形1和4,情形2和3分别是关于A节点的镜像对称,故在理论上是两种情况,而编程具体实现还是需要考虑四种。
单旋转--情形1和4:
双旋转--情形2和3:
情形2和3就是向上图中的子树Y插入一个节点,由上图可知,无论是左单旋还是右单旋都无法改变子树Y的高度。解决办法是再将子树Y分解成根节点和相应的左子树和右子树,然后对相应的节点做相应的旋转,如下图:
下面一个题即是考察AVL树的旋转:题目来源:http://www.patest.cn/contests/mooc-ds/04-%E6%A0%914
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.
Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print ythe root of the resulting AVL tree in one line.
Sample Input 1:
5
88 70 61 96 120
Sample Output 1:
70
Sample Input 2:
7
88 70 61 96 120 90 65
Sample Output 2:
88
题目大意是先输入一个整数N,然后依次输入N个节点的值,以此建立AVL树,最后输出AVL树的根节点的值。
代码如下:
#include #includetypedefstruct TreeNode *AvlTree;
typedefstruct TreeNode *Position;structTreeNode
{intData;
AvlTree Left;
AvlTree Right;intHeight;
};
AvlTree Insert(int x, AvlTree T); //插入新节点,必要时调整
Position SingleRotateWithLeft(Position a); //左单旋
Position SingleRotateWithRight(Position b); //右单旋
Position DoubleRotateWithLeft(Position a); //左右旋
Position DoubleRotateWithRight(Position b); //右左旋
int Max(int x1, int x2); //返回两个int中较大的
int Height(Position P); //返回一个节点的高度
intmain()
{intn, x;
AvlTree T=NULL;
scanf("%d", &n);for (int i = 0; i < n; i++)
{
scanf("%d", &x);
T=Insert(x, T);
}
printf("%d\n", T->Data); //打印根节点的值
return 0;
}
AvlTree Insert(intx, AvlTree T)
{if (T ==NULL)
{
T= (AvlTree)malloc(sizeof(structTreeNode));
T->Data =x;
T->Left = T->Right =NULL;
T->Height = 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);elseT=DoubleRotateWithLeft(T);
}
}else if (x > T->Data) //向右子树插入
{
T->Right = Insert(x, T->Right);if (Height(T->Right) - Height(T->Left) == 2) //需调整
{if (x > T->Right->Data)
T=SingleRotateWithRight(T);elseT=DoubleRotateWithRight(T);
}
}/*else值为x的节点已经存在树中,无需插入*/
/*更新节点高度*/T->Height = Max(Height(T->Left), Height(T->Right)) + 1;returnT;
}
Position SingleRotateWithLeft(Position a)
{
Position b= a->Left;
a->Left = b->Right;
b->Right =a;//更新a, b节点高度
a->Height = Max(Height(a->Left), Height(a->Right)) + 1;
b->Height = Max(Height(b->Left), Height(b->Right)) + 1;return b; /*新的根节点*/}
Position SingleRotateWithRight(Position b)
{
Position a= b->Right;
b->Right = a->Left;
a->Left =b;//更新a,b节点高度
a->Height = Max(Height(a->Left), Height(a->Right)) + 1;
b->Height = Max(Height(b->Left), Height(b->Right)) + 1;return a; /*新的根节点*/}
Position DoubleRotateWithLeft(Position a)
{
a->Left = SingleRotateWithRight(a->Left);returnSingleRotateWithLeft(a);
}
Position DoubleRotateWithRight(Position b)
{
b->Right = SingleRotateWithLeft(b->Right);returnSingleRotateWithRight(b);
}int Max(int x1, intx2)
{return (x1 > x2) ?x1 : x2;
}intHeight(Position P)
{if (P == NULL) //空节点高度为-1
return -1;return P->Height;
}
需要注意的细节是我们需要快速得到一个节点(包括空节点)的高度,所以我们需要些一个函数来处理空节点(空指针)的情况,而不是简单的Position->Height。
平衡查找树C语言程序,树4. Root of AVL Tree-平衡查找树AVL树的实现相关推荐
- 平衡查找树C语言程序,C语言数据结构之平衡二叉树(AVL树)实现方法示例
本文实例讲述了C语言数据结构之平衡二叉树(AVL树)实现方法.分享给大家供大家参考,具体如下: AVL树是每个结点的左子树和右子树的高度最多差1的二叉查找树. 要维持这个树,必须在插入和删除的时候都检 ...
- 二叉排序树查找的c语言程序,C语言二叉排序(搜索)树实例
本文实例为大家分享了C语言二叉排序(搜索)树实例代码,供大家参考,具体内容如下 /**1.实现了递归 非递归插入(创建)二叉排序(搜索)树: 分别对应Insert_BinSNode(TBinSNode ...
- 蜗牛爬树c语言程序函数,弹涂鱼上树吃蜗牛?鄂教版小学二年级课文遭吐槽
海边一棵树上有一群小蜗牛在吃树叶,弹涂鱼爬到树顶,将这群"害虫"全吃光.鄂教版小学语文二年级上册<会上树的鱼>讲的这则童话故事,遭到华中农业大学植物与昆虫学院副教授.萤 ...
- 家谱树c语言程序,Javascript库 - 家谱树流程图
我定制了一个Graphviz点文件来产生这样的输出.目前我正在编写一个Ruby脚本以从.gedcom文件生成此脚本. 这里的.dot内容,带数字的节点只是点,并以正确的方式流动边缘. digraph ...
- 递归折半查找法 c语言程序,折半查找法的递归和非递归形式
/* 1.折半查找的查找过程是:先确定待查记录所在区间,然后逐步缩小范围至到找到或者找不到该记录为止. 2.折半查找的性能分析可以由判定树得出,折半查找在查找成功时给定值进行比较的关键字个数至多为⌊l ...
- 平衡小车c语言程序,【全部开源】两轮平衡小车(原理图、PCB、程序源码、BOM等)...
同网上一般网友制作的平衡小车不一样,这个平衡小车最大的特点就是它的整体很小,PCB面积只有2.5cm*5.0cm,这个可能还没有网友制作的平衡小车的一个电机驱动板大,但是却已经实现了相同的功能.我在器 ...
- PAT甲级1066 Root of AVL Tree (25分):[C++题解]建立平衡树(AVL树)
文章目录 题目分析 题目链接 题目分析 图片来源:acwing 分析 平衡树(AVL树)是平衡二叉搜索树的简称,当然需要满足二叉搜索树的性质,左子树小于根,根小于等于右子树:然后还要满足平衡树的基本特 ...
- c语言利用遍历求树高的程序,用C语言实现二叉树的遍历极其应用
用C语言实现二叉树的遍历极其应用 [1][摘要]:<数据结构>是计算机系学生的一门专业技术基础课程,计算机科学各领域及有关的应用软件都要用到各种数据结构.C语言有较丰富的数据类型.运算符以 ...
- c语言 trie树,C语言实现Trie树(字典树)的插入查找删除与遍历操作
Trie树,也称作是字典树,是一种哈希树的变种,查询效率较高.Trie树可以用于统计或者排序大量的字符串,比如对一系列字符串按照字典序排序. 字典树是一个多叉树,每一个节点上存储的不是一个字符串,而是 ...
最新文章
- Java反射(详述版)
- 面包好吃却五毒俱全,吃前请三思!
- 直播预告丨加速消费金融行业运营体系新升级,驱动经营提质增效!
- Bilibili资深运维工程师:DCDN在游戏应用加速中的实践
- 样条之贝塞尔(Bezier)
- Nacos(十)之Kubernetes Nacos
- linux判断改行符_Linux判断符如何使用?
- 逗比学树莓派之GPIO
- 团队管理中的每日站立会
- 大话设计模式读书笔记(十三) 状态模式
- springboot配置文件加载顺序_「SpringBoot系列」配置文件加载优先级解析
- 华为手机上的网上邻居怎么用_只要华为手机用上鸿蒙OS2.0,刚买的手机我也马上换!...
- 数据分析看关晓彤的招黑之路
- 实用主义学python 云盘_多领域实用主义学Python项目视频教程-2018年麻瓜编程
- pytorch实战:采用Lenet运行iChallenge-PM数据集
- 基于vue,自定义条形进度条/辣条进度条
- CMD管理员运行切换目录
- C语言练手项目--C 语言制作简单计算器
- 烧脑大片《盗梦空间》与户外广告有什么关系?
- 水土保持监测,无人机倾斜摄影该如何做?
热门文章
- Solaris 操作
- XmlHttp学习笔记
- [转]图片自动缩放 js图片缩放
- pip安装kolla-ansible时报错Cannot install ‘PyYAML‘的解决方法
- ssh遇到port 22:No route to host问题的解决方法
- Unknown host ‘services.gradle.org‘ 解决方法
- 异常记录: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError
- Intellij IDEA中生成jar包
- 开源工具高效分析Java应用
- VR/AR会是微信后马化腾进军的战场吗