您的位置:首页 > 其它

平衡树的理解笔记

2016-03-03 10:00 253 查看
最近在理解平衡树的概念时,想先自己手动设计,设想 如果是我的话,我会怎么解决这个问题。在设计的过程中,发现一定要懂得利用 数学归纳法 的思想,这一点很重要,相当于给问题赋予了已知条件,可以简化问题,将问题简单化。 其实以前做ACM题思考算法的过程都用了这个思想,发现有时候会忘了利用这个思想,然后就没了一些好条件,浪费了一大把时间。这一次思考平衡树的过程也忘了这个思想,导致浪费了时间。。。 

看代码是弄懂一个算法的一个很有帮助的途径。

举个例子说明其实就是,你想自己设计一个方法来保持二叉树的性质,那么你可以一个节点一个节点的进行二叉树的节点增加操作,然后利用归纳法的思想,一开始你的二叉树都是保有良好性质的二叉树,即好二叉树,而在某一步时,出现了坏二叉树,这时候可以先想如何把这个坏二叉树变成好二叉树,

问题得到了简化,因为,这个坏二叉树=好二叉树+1个节点,这个条件非常重要!!!

二叉搜索树可能出现失衡的清醒。构造二叉树需要尽量平均分配,而失衡其实意思就是分配不平均,左右子树高度相差太大,那什么是高度相差太大,很容易可以感受就是高度相差2或者2以上。  而平衡二叉树就是为了平衡,使高差差尽量小

然后就是理解 旋转 的概念。 首先,旋转是一种针对二叉树的操作,是为了解决二叉树失衡的一种操作。

那么怎么弄懂旋转,

一种方法是直接查资料,然后根据网上的图示,弄懂旋转具体是怎么操作的,然后弄明白旋转为什么可以平衡二叉树。

另一种方法就是自己去构造二叉树,一旦出现不平衡情况,你会怎么解决,然后去画草稿自己解决,然后你可以设计各种各样的方法,有些方法会被你否决,而有些方法会被采纳,  然后再去查阅资料,你会发现,旋转操作其实已经被你想到了,只是当时你不知道这个操作叫旋转,或者说这个操作被大多数人定义为 旋转。

treap树堆,就是给节点加了优先级,同理,你可以先自己想想,如果是你的话,你会怎么设计节点增加与删除操作。

弄明白了treap树堆的节点插入操作,可以发现,节点删除操作其实就是节点插入操作的逆过程。

treap树堆已经理解好了,现在正在想AVL树,已经弄懂AVL树的节点添加操作,即各种旋转操作,现在正在思考节点删除操作。已经弄懂AVL树的节点删除操作。

其实AVL树的对高度差超过2的子树中比较高的子树进行向下划分,使得最后得到的4个子树之间高度保持1的差距。得到4个子树后进行再分配,旋转操作就是为了再分配。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  笔记 草稿