数据结构——树

对于大量的输入数据,链表的线性访问时间太慢,不宜使用。所以这就引出了一种简单地数据结构,其大部分操作的运行时间平均为O(logN)

树的定义

一棵树是N个节点和N-1条边的集合,其中的一个节点叫做根。存在N-1条边的结论是由下面的事实得出的:每条边都将某个节点连接到它的父亲,而除去根节点外每一个节点都有一个父亲。没有儿子的节点称为树叶。具有相同父亲的节点为兄弟。
这里写图片描述
从节点n1到nk的路径定义为节点n1,n2,…,nk的一个序列,使得对于i<=i

二叉树

二叉树是一棵树,其中每个节点都不能有多于两个的儿子。二叉树的一个性质是一棵平均二叉树的深度要比节点个数N小得多,这个性质有时很重要。分析表明,其平均深度为O(根号N),而对于特殊类型的二叉树(下面我们马上就会说到)即二叉查找树,其深度的平均值是O(logN) ,不幸的是,下图这个例子展示了最坏情形的二叉树,这个深度是可以大到N-1的。
这里写图片描述
因为一个二叉树节点最多有两个子节点,所以我们可以保存直接链接到它们的链。树节点的声明在结构上类似于双链表的声明,在声明中,节点就是element的信息加上两个到其他节点的引用(left和right)组成的结构。

“`
class BinaryNode
{
Object element;
BinaryNode left;
BinaryNode right;
}

二叉查找树

使二叉树称为二叉查找树的性质是,对于树种的每个节点X,它的左子树种所有项的值小于X中的项,而它的右子树种所有项的值大于X中的项。因为二叉查找树的平均深度是O(logN) 所以一般不必担心栈空间被用尽。
在使用懒惰删除的情况下,我们可以得到:contains(),findMin(),findMax(),insert(),remove(),这些操作的平均运行时间都是O(logN)
如果向一颗树输入预先排好序的数据,那么一连串insert操作将花费二次的时间,而链表的实现的代价会非常巨大,因为此时的树将只由那些没有左儿子的节点组成。一种办法就是要有一个平衡的附加的结构条件:任何节点的深度均不得过深。

AVL树

AVL树是带有平衡条件的二叉查找树。一颗AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树(空树定义为-1)。节点需要存储高度信息。
当进行插入操作的时候会破坏原本的平衡条件。我们把必须重新平衡的节点叫做a。由于任意节点最多有两个儿子,因此出现高度不平衡就需要a点的两颗子树高度差2.容易看出这种不平衡可能出现在下面四中情况中:
1.对a的左儿子的左子树进行一次插入。
2.对a的左儿子的右子树进行一次插入。
3.对a的右儿子的左子树进行一次插入。
4.对a的右儿子的右子树进行一次插入。
事实上,这总可以通过对数进行简单地修正来做到,我们称其为旋转。旋转分为单旋转(适用于情况1和4)和双旋转(适用于情况2和3)。

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

向AVL树插入可以通过如同它是未平衡的二叉查找树一样把给定的值插入树中,接着自底向上向根节点折回,于在插入期间成为不平衡的所有节点上进行旋转来完成。因为折回到根节点的路途上最多有 1.5 乘 log n 个节点,而每次 AVL 旋转都耗费恒定的时间,插入处理在整体上耗费 O(log n) 时间。从AVL树中删除可以通过把要删除的节点向下旋转成一个叶子节点,接着直接剪除这个叶子节点来完成。因为在旋转成叶子节点期间最多有 log n个节点被旋转,而每次 AVL 旋转耗费恒定的时间,删除处理在整体上耗费 O(log n) 时间。在AVL树中查找耗费 O(log n) 时间。

伸展树

伸展树是一种二叉排序树,它能在O(log n)内完成插入、查找和删除操作。
在伸展树上的一般操作都基于伸展操作:假设想要对一个二叉查找树执行一系列的查找操作,为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法, 在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。伸展树应运而生。伸展树是一种自调整形式的二叉查找树,它会沿着从某个节点到树根之间的路径,通过一系列的旋转把这个节点搬移到树根去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值