平衡树的理解笔记
2016-03-03 10:00
253 查看
最近在理解平衡树的概念时,想先自己手动设计,设想 如果是我的话,我会怎么解决这个问题。在设计的过程中,发现一定要懂得利用 数学归纳法 的思想,这一点很重要,相当于给问题赋予了已知条件,可以简化问题,将问题简单化。 其实以前做ACM题思考算法的过程都用了这个思想,发现有时候会忘了利用这个思想,然后就没了一些好条件,浪费了一大把时间。这一次思考平衡树的过程也忘了这个思想,导致浪费了时间。。。
看代码是弄懂一个算法的一个很有帮助的途径。
举个例子说明其实就是,你想自己设计一个方法来保持二叉树的性质,那么你可以一个节点一个节点的进行二叉树的节点增加操作,然后利用归纳法的思想,一开始你的二叉树都是保有良好性质的二叉树,即好二叉树,而在某一步时,出现了坏二叉树,这时候可以先想如何把这个坏二叉树变成好二叉树,
问题得到了简化,因为,这个坏二叉树=好二叉树+1个节点,这个条件非常重要!!!
二叉搜索树可能出现失衡的清醒。构造二叉树需要尽量平均分配,而失衡其实意思就是分配不平均,左右子树高度相差太大,那什么是高度相差太大,很容易可以感受就是高度相差2或者2以上。 而平衡二叉树就是为了平衡,使高差差尽量小
然后就是理解 旋转 的概念。 首先,旋转是一种针对二叉树的操作,是为了解决二叉树失衡的一种操作。
那么怎么弄懂旋转,
一种方法是直接查资料,然后根据网上的图示,弄懂旋转具体是怎么操作的,然后弄明白旋转为什么可以平衡二叉树。
另一种方法就是自己去构造二叉树,一旦出现不平衡情况,你会怎么解决,然后去画草稿自己解决,然后你可以设计各种各样的方法,有些方法会被你否决,而有些方法会被采纳, 然后再去查阅资料,你会发现,旋转操作其实已经被你想到了,只是当时你不知道这个操作叫旋转,或者说这个操作被大多数人定义为 旋转。
treap树堆,就是给节点加了优先级,同理,你可以先自己想想,如果是你的话,你会怎么设计节点增加与删除操作。
弄明白了treap树堆的节点插入操作,可以发现,节点删除操作其实就是节点插入操作的逆过程。
treap树堆已经理解好了,现在正在想AVL树,已经弄懂AVL树的节点添加操作,即各种旋转操作,现在正在思考节点删除操作。已经弄懂AVL树的节点删除操作。
其实AVL树的对高度差超过2的子树中比较高的子树进行向下划分,使得最后得到的4个子树之间高度保持1的差距。得到4个子树后进行再分配,旋转操作就是为了再分配。
看代码是弄懂一个算法的一个很有帮助的途径。
举个例子说明其实就是,你想自己设计一个方法来保持二叉树的性质,那么你可以一个节点一个节点的进行二叉树的节点增加操作,然后利用归纳法的思想,一开始你的二叉树都是保有良好性质的二叉树,即好二叉树,而在某一步时,出现了坏二叉树,这时候可以先想如何把这个坏二叉树变成好二叉树,
问题得到了简化,因为,这个坏二叉树=好二叉树+1个节点,这个条件非常重要!!!
二叉搜索树可能出现失衡的清醒。构造二叉树需要尽量平均分配,而失衡其实意思就是分配不平均,左右子树高度相差太大,那什么是高度相差太大,很容易可以感受就是高度相差2或者2以上。 而平衡二叉树就是为了平衡,使高差差尽量小
然后就是理解 旋转 的概念。 首先,旋转是一种针对二叉树的操作,是为了解决二叉树失衡的一种操作。
那么怎么弄懂旋转,
一种方法是直接查资料,然后根据网上的图示,弄懂旋转具体是怎么操作的,然后弄明白旋转为什么可以平衡二叉树。
另一种方法就是自己去构造二叉树,一旦出现不平衡情况,你会怎么解决,然后去画草稿自己解决,然后你可以设计各种各样的方法,有些方法会被你否决,而有些方法会被采纳, 然后再去查阅资料,你会发现,旋转操作其实已经被你想到了,只是当时你不知道这个操作叫旋转,或者说这个操作被大多数人定义为 旋转。
treap树堆,就是给节点加了优先级,同理,你可以先自己想想,如果是你的话,你会怎么设计节点增加与删除操作。
弄明白了treap树堆的节点插入操作,可以发现,节点删除操作其实就是节点插入操作的逆过程。
treap树堆已经理解好了,现在正在想AVL树,已经弄懂AVL树的节点添加操作,即各种旋转操作,现在正在思考节点删除操作。已经弄懂AVL树的节点删除操作。
其实AVL树的对高度差超过2的子树中比较高的子树进行向下划分,使得最后得到的4个子树之间高度保持1的差距。得到4个子树后进行再分配,旋转操作就是为了再分配。
相关文章推荐
- AS3自写类整理笔记 ClassLoader类第1/2页
- AS3自写类整理笔记 Dot类第1/2页
- DB2新手使用的一些小笔记:新建实例、数据库路径不存在、客户端连接 .
- perl脚本学习指南--读书笔记
- 《C++ primer plus》读书笔记(三)
- 《C++ primer plus》读书笔记(二)
- jquery 笔记 事件
- VPS 配置优化笔记
- android新建草稿删除后下次开机还会显示保存的草稿
- Ajax学习笔记整理
- 一千行的MySQL学习笔记汇总
- 两千行代码的PHP学习笔记汇总
- 用来记笔记的软件 EverNote 2.2.1.386提供下载
- Hibernate的学习笔记(3)
- CentOS6.X下Docker安装笔记
- CentOS下Redis高可用安装笔记
- 在Flickr的开发与运维合作(笔记)
- Shell脚本学习笔记
- notes on python
- SSH无需密码密钥登录