数字的森林——各种树数据结构解析

眨眼间数据结构课已经接近尾声了。Rose-Hulman这个数据结构课,从非线性数据结构开始讲起(因为线性数据结构——链表、堆栈和队列——已经在上一个面向对象设计课里面学过)讲了近10种树结构和少量的图结构。其中对所有的树更是印象深刻。

下面还是总结一下这个学期学了什么。

首先介绍了基本的树结构(Tree)



由此可见,树其实可以算是一个链表形式的结构,只不过每一个结点都连着一个或多个结点,任君选择。

然后是二叉树(Binary Tree)


二叉树严格控制了每个结点最多只能有两个后继结点(简称“儿子”)控制了这样的结构之后,这棵树就比普通的树简单很多啦。

如果我们再用二叉树来做点有意义的事情,比如说保持结构里面结点的大小顺序等等,于是我们就有一个更实用的树结构:二叉查找树(Binary Search Tree)


在 二叉树的基本定义上,二叉查找树有一层更深的定义:左儿子的元素大小严格小于父结点,右儿子的元素大小严格大于父结点。这样的话,进行搜索的时候,从根结 点出发,如果想要找的元素比这个结点小,向左搜,否则向右搜。这样的搜索效率竟然可以控制到平均O(log n)!实在是太快了!

不过,O(log n)的效率仅限于一棵比较随机的二叉查找树,如果一棵二叉查找树,儿子永远比父亲大,那么就会变成一条直线,效率也是只有O(n)而已。那么效率就变得很虚无飘渺了。

幸好,伟大的计算机科学家们在二叉查找树的基础上,加上了自动平衡的算法,因此创造出AVL树(AVL Tree)


AVL树的平衡条件是:左儿子高度与右儿子高度相差不超过1,上图则是给出了平衡算法。告诉大家该怎么样对树进行旋转,而得到一棵新的平衡树。

AVL树的效率已经非常可观了,平衡之后整棵树的访问效率为O(log n),插入移除效率O(log n),可谓十分迅速!

但是人们总是不知足的,与其通过分析树本身结构来调整,倒不如自己创建标记,再根据标记来调整,减少旋转次数!于是红黑树(Red Black Tree) 就此诞生:


红黑树的规则比较复杂,在此不赘述。这棵树比AVL树快的原因有二:

1. 此树插入和移除可以用递推来实现(递推和递归的异同我这里不赘述,可以看看我之前写的文章),因此可以不保存向下遍历的路线来调整,而是边往下走边调整!

2. 移除元素时,此树最多只需两次旋转,AVL树需要多次旋转。因此元素多的时候,速度优势就出来了。

如果你连这个红黑标记都懒得搞的话,伸展树(Splay Tree) 比较适合你。伸展树有二叉查找树的属性,但是不同的地方是:每一次搜索元素的时候,会自行对树进行调整。尽管树的结构没有红黑树或者AVL树那么整齐,但是在平摊分析 (又称Amortized Analysis )还是能够达到O(log n)的整体效率。

除此之外,还有B树AA树 等等有趣的树呢!整体结构都是非常优秀的。当然这些都只是数字森林的冰山一角,其他的还是由你们自己探索啦!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值