我的新发现:AVL树旋转的一个特性

关于AVL树旋转的代码网络上铺天盖地。

一些经典的实现方法如下:

AVLTree SingleLeftRotation(AVLTree A)
{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->Left = SingleRightRotation(A->Left);return SingleLeftRotation(A);
}

这段代码看上去很有美感,短小精悍。

不过我发现了一点,其实单向旋转不用使用Max比较左右节点的高度,因此我是这样实现的:

PNODE SingleRightRotation(PNODE A) // 右右旋转,返回旋转部分的根节点
{PNODE B = A->right;A->right = B->left;B->left = A;A->height = Height(A->left) + 1; // 这里没有通过比较更新A的高度,因为BL不会大于AL(否则在之前它们就不平衡了)B->height = A->height + 1; // 与上述理由类似return B;
}

但是随之带来了一个问题,就是双向旋转依赖于单向旋转的实现,因此在有双向旋转操作的前提下,代码还能正确的做它应该做的事情吗?

我试着证明了一下,我的代码在无论单向还是双向旋转的情况下都是正确的:

这是我在PAT上用自己的代码AC之后与何钦铭老师的对话:

我:

我在pat上做这道题:04-树3. Root of AVL Tree (25)的时候,单向旋转是这样做的:
PNODE SingleRightRotation(PNODE A) // 右右旋转,返回旋转部分的根节点
{PNODE B = A->right;A->right = B->left;B->left = A;A->height = Height(A->left) + 1; // 这里没有通过比较更新A的高度,因为BL不会大于AL(否则在之前它们就不平衡了)B->height = A->height + 1; // 与上述理由类似return B;
}
正如注释上所写,我认为A的高度不用通过比较来更新,我觉得其高度和BL没有关系,因为BL不可能大于AL,否则它们在之前就不平衡了,就早早的经过旋转达到平衡了。这样做以后提交正确了,因此,想跟老师确认一下,这样理解正确吗?

何钦铭老师:

你提的问题很好呀。在仅针对LL、RR旋转的情况下,你的做法是可以的(不需要max的比较)。但LR和RL也是通过两次调用SingleRightRotation和SingleLeftRotation来实现的,在这种情况下,你的做法是否仍然有效需要再仔细琢磨一下。

我:

恩恩,这个测试数据比较少,不能通过AC来证明它是正确的,但是我在理论上证明了一下,似乎可行:
首先,对于单向旋转,只需要说明一种情况正确即可,以RR旋转为例:AL与BL的关系只有三种,即:AL = BL;AL = BL+1;AL = BL+2 综合上述三种情况,AL ≥ BL。因此无须比较。由于节点是插在BR上的,在加上A左右两侧高度差为2这个条件,可得AL+1 = BR,但是旋转之后B为根了,所以AL+A = BR,因此更新B的高度使取AL+A或者BR两者皆可(下面会说明双向旋转的时候不可以用BR),因为它们是相等的,也无须比较。
其次,对于双向旋转,以LR旋转为例:第一步操作是以B为根的RR旋转,而此时的B是平衡的(因为不平衡的只有A,如果不考虑A的父节点的话),要证明它的旋转也不需要比较,需要证明BL ≥ CL,而这一点由B是平衡的来保证。此外,还需要证明BL+B ≥ CR,不管插入的节点在CL还是CR,这一点同样可以由B是平衡的来保证(这里的CR相对应与单向旋转的BR,因为存在BL+B > CR的情况(与单向旋转中AL+A = BR不同),这也是单向旋转中不能用BR来更新B的高度的原因)。接下来的操作是以A为根的LL旋转,此时C变成了A的左子树,B成了C的左子树,而且由第一步的分析可以知道各个节点的高度都得到了有效的更新,但是从层次上看, BL降了一层,CL所在的层次不变,而CR的层次上升了一层,在这种状况下要证明无须比较的LL旋转是正确的,就比较困难了,但是不难发现,只要证明不平衡的节点仍然只有A(如果节点插入到CL,那么A肯定不平衡,如果节点插入到CR,可以由BL降了一层来保证A仍然是不平衡的,其实,只要BL降了,不管节点插在CL还是CR,A就肯定不平衡了)就可以保证LL旋转的正确性,但是第一步操作有没有造成不平衡的节点产生也是需要考虑的一个方面,我的想法是不用管它,把RR旋转后的结果画出来,发现要证明LL旋转是正确的只要证明A+AR可以使得C所在的高度达到最大就可以了,这一点可以由AR不会比BL、CL、CR(CL或CR代表插入之后的高度)三个中的任何一个小来保证。不知道这样的分析是否正确,不过,我愿意相信它,因为人类往往偏向于相信自己的直觉....

如果它是正确的话,那么在AVL树中就可以利用它提速、省空间,虽然微不足道,但是属于自己发现的,心里还是很爽的:P

All Rights Reserved.
Author:海峰:)
Copyright © xp_jiang. 
转载请标明出处:http://www.cnblogs.com/xpjiang/p/4491250.html
以上.

转载于:https://www.cnblogs.com/xpjiang/p/4491250.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VC中设置头文件的搜索路径~~

From:http://hi.baidu.com/woaimuxiaoyizhong/blog/item/cc3d260a9b75f21795ca6b2a.html 近日,小弟在研究UCOS VC版的时候,发现它的头文件并没有在当前目录下,却可以精确的找到。我估计一定是:VC编辑器早设置好了,早已…

真是的= =还是对linux不太了解啊

最近很无聊.....得到了3天假期~~~ 于是乎把Ubuntu10.10下载下来安装了 结果第二天root用户就登陆不上了 进入单用户模式后读shower文件发现密码那就一"!" 真是奇怪.... 之前在网上查说passwd命令没加载... 结果明明加载了 改了之后终于用上root权限了 结果又是惨…

php form validator 下单,PHP Form表单验证:PHP form validator使_php

在php网站开发建设中,用户注册、留言是必不可少的功能,用户提交的信息数据都是通过Form表单提交,为了保证数据的完整性、安全性,PHP Form表单验证是过滤数据的首要环节,PHP对表单提交数据的验证方式多种多样&#xff0…

云服务器,价格其实不便宜,但为什么还要用呢

2012年的时候,接触到云服务器,一心想搞个个人网站。当时,云服务器最低配置,1个月55元,1M带宽、1核CPU、512M内存,独立IP。加上,一些优惠,代金券之内的,1年400元左右。自认…

React开发(189):ant design textarea允许清除allowClear

<div style{{ margin: 10px 0 }}><span style{{ marginRight: 50px }}>调整原因</span><span><TextAreastyle{{ width: 55% }}placeholder"请输入调整原因"value{balancchangereason}formatter{(value) > &#xffe5; ${value}.repla…

DOS管道与重定向

From:http://hi.baidu.com/liouxueyun/blog/item/6951d9611ab9b76a0d33fa60.html 一、 重定向&#xff1a; 所谓重定向&#xff0c;就是不使用系统的标准输入端口、标准输出端口或标准错误端口&#xff0c;而进行重新的指定&#xff0c;所以重定向分为输出重定向、输入重定…

js 调用服务器端方法总结

javascript函数中执行C#代码中的函数&#xff1a; 方法一&#xff1a;1、首先建立一个按钮&#xff0c;在后台将调用或处理的内容写入button_click中; 2、在前台写一个js函数&#xff0c;内容为document.getElementById("btn1").click(); 3、在前台或…

[C语言 - 12] Union联合

union Student{int age;char *name;} stu;union只按照最长的数据成员分配控件&#xff0c;适用于有N个数据不会同时出现的情况&#xff0c;用以压缩空间。转载于:https://www.cnblogs.com/wvqusrtg/p/4501217.html

新闻数据采集php,PHP新闻采集在线源码

PHP新闻采集在线源码可以高效采集新闻网站内容&#xff0c;由于它是一种可以在服务器端执行的嵌入HTML文档的脚本语言&#xff0c;所以它支持在UNIX、LINUX、WINDOWS等系统下运行&#xff0c;而且消耗的系统资源很少。PHP新闻采集在线源码介绍全网采集采集任意互联网公开数据Aj…

[Objective-c 基础 - 1.3] OC带返回值的类方法

1 /*2 计算器类3 1>返回π4 2>计算两个整数的平方5 3>计算两个整数的和6 */7 8 9 #import <Foundation/Foundation.h> 10 11 interface Calculator: NSObject 12 //方法名:pi 13 - (double) pi; 14 15 //OC方法中&#xff0c;一个参数对应一个冒号: 16 /…

UCGUI的模拟器UCGUISim详解

From: http://www.cnblogs.com/shellstudio/articles/ucgui.html 本文转自www.ucgui.com感谢原作者(最近发现该网站已经撤销,不知道作者近况如何.想当初,他对我理解ucgui提供了很多支持和帮助呢!)。 联系方式: ucgui.comgmail.com 一、问题的由来-----模拟器完成了什么 在官方发…

php 最后几个字符,php怎么去掉最后三个字符

在php中&#xff0c;可以利用substr()函数来去掉字符串最后三个字符&#xff0c;该函数可以返回字符串的一部分&#xff1b;具体语法格式为“substr(指定字符串,0,-3)”。本教程操作环境&#xff1a;windows7系统、PHP7.1版&#xff0c;DELL G3电脑php去掉字符串最后三个字符he…

透过北京通信展看国产手机的崛起

透过北京通信展看国产手机的崛起<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />小刀马北京国际通信展已经落下了帷幕&#xff0c;多少繁花似锦都已归尘土&#xff0c;本届通信展到底给我们留下了什么印象什么回忆&#xff1f;大…

Spark(四) -- Spark工作机制

一、应用执行机制 一个应用的生命周期即&#xff0c;用户提交自定义的作业之后&#xff0c;Spark框架进行处理的一系列过程。 在这个过程中&#xff0c;不同的时间段里&#xff0c;应用会被拆分为不同的形态来执行。 1、应用执行过程中的基本组件和形态 Driver&#xff1a; 运…

Linux下查看文件和文件夹大小的df和du命令

From: http://www.yayu.org/look.php?id162 当磁盘大小超过标准时会有报警提示&#xff0c;这时如果掌握df和du命令是非常明智的选择。 df可以查看一级文件夹大小、使用比例、档案系统及其挂入点&#xff0c;但对文件却无能为力。 du可以查看文件及文件夹的大小。 两者配…

php打开就执行url,php执行URL解析

方法一&#xff1a;$url"http://www.baidu.com";file_get_contents($url);方法二&#xff1a;// CURL 方法$url"http://www.baidu.com";$ch curl_init( );curl_setopt( $ch,CURLOPT_URL,$url );curl_setopt( $ch,CURLOPT_HEADER,0 );curl_setopt( $ch,CUR…

java的classpath

转自&#xff1a;http://takkymj.javaeye.com/blog/734408 1、class搜索路径的重要性 理解class搜索路径对所有Java开发人员来说都很重要&#xff0c;但是&#xff0c;IDE的广泛使用掩盖了这项技术&#xff0c;使大家普遍对它缺乏了解&#xff0c;甚至包括好多老鸟。这个问题在…

深入react技术栈(12):组件内通信

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣获取前后端知识 父组件向子组件传值 子组件向父组件传值 跨级组件通信 没有嵌套关系的组件通信 文章参考深入React技术栈

《迷宫》之站立会议—5.15

会议时间&#xff1a;7:10 内容&#xff1a; 还没怎么做&#xff0c;组长有些着急&#xff0c;表示快快做。 转载于:https://www.cnblogs.com/little-clever/p/4505113.html