关于树

大部分学习所得来自:《STL源码剖析》侯捷

首先,STL中的容器分为序列式容器和关联式容器。在后者中set、map、multiset、multimap,底层机制以RB-tree(红黑树)完成;hash_set、hash_map、hash_multiset、hash_multimap,底层机制由hashtable完成。

一般而言,关联式容器的内部结构是一个balanced binary tree(平衡二叉树:一棵空树或者它的左右子树的高度差的绝对值超过1,并且它的左右子树都为二叉平衡树)。二叉平衡树有很多类型,包括AVL-tree、RB-tree、AA-tree,其中最被广泛运用于STL的是RB-tree。

1、二叉搜索树:任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。可提供对数时间的元素插入和查询。

2、AVL tree(Adelson-Velskii-Landis tree):是一个“加上了额外平衡条件”的二叉搜索树,其平衡条件的建立是为了确保整棵树的深度为O(logN)。它要求任何节点的左右子树高度相差最多为1,可保证“对数深度”平衡状态。

在平衡被破坏时,采用“单旋转”修正外侧插入导致的不平衡,采用“双旋转”修正内侧插入导致的不平衡。

3、红黑树:

红黑树的平衡性相比AVL树弱,但是红黑树通常能够导致良好的平衡状态,其搜寻平均效率和AVL树几乎相等。

红黑树从根到叶子的最长路径不会超过最短路径的2倍。

不仅仅是一个二叉搜索树,还必须满足以下规则

(1)每个节点不是红色就是黑色

(2)根节点为黑色

(3)如果节点为红,其子节点必须为黑

(4)任一节点至NULL(树尾端)的任何路径,所含之黑节点数必须相同。

根据规则4,新增节点必须为红;根据规则3,新增节点的父节点必须为黑。当新节点根据二叉搜索树的规则到达插入点时,却不符合上述条件,那么就必须调整颜色并旋转树形。

4、红黑树与AVL树的比较:

AVL是严格的平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多

红黑树是用非严格的平衡来换取增删节点时候旋转次数的降低开销;

所以简单说,如果你的应用中,搜索的次数远远大于插入和删除,那么选择AVL树,

如果搜索,插入删除次数几乎差不多,应选择红黑树。即,有时仅为了排序(建立-遍历-删除),不查找或查找次数很少,R-B树合算一些。

红黑树与AVL树的调整平衡的实现机制不同,AVL靠平衡因子和旋转,红黑树靠节点颜色以及一些约定再加上旋转。因此,存在去掉颜色的红黑树后它不是AVL树,比如左子树都是黑的,右子树都是红黑相间的,这样整个树高度2n的时候,根节点的左右层数差可以到n。

红黑树能够以O(log2 n) 的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构 能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高。当然,红黑树并不适应所有应用树的领域。如果数据基本上是静态的,那么让他们待在他们能够插入,并且不影响平衡的地方会具有更好的性能。如果数据完全是静态的,例如,做一个哈希表,性能可能会更好一些。

AVL树在顺序插入和删除时有20%左右的性能优势,但随机性能反而落后15%左右,现实应用当然一般都是随机情况,所以红黑树得到了更广泛的应用。

Java中是一种基本的数据结构,它是由节点(Node)和边(Edge)组成的数据集合。每个节点最多有一个父节点和多个子节点。是一种递归结构,它可以无限扩展,但是根节点只有一个。 以下是Java中关于的一些重要的知识点: 1. 的遍历:的遍历包括前序遍历、中序遍历和后序遍历。前序遍历是先访问根节点,然后依次访问左子和右子;中序遍历是先访问左子,然后访问根节点,最后访问右子;后序遍历是先访问左子,然后访问右子,最后访问根节点。 2. 二叉:二叉是一种特殊的,每个节点最多有两个子节点,左子和右子。二叉可以通过遍历方式进行操作,包括前序遍历、中序遍历和后序遍历。 3. 二叉查找(BST):二叉查找是一种特殊的二叉,它的左子的所有节点都小于根节点,右子的所有节点都大于根节点。它可以通过快速查找来实现对数据的高效操作。 4. 平衡:平衡是一种特殊的二叉,它的左右子的高度差不超过1。平衡可以提高的查找效率,例如红黑树AVL。 5. 的应用:在计算机科学中有广泛的应用,例如数据库索引、操作系统中的文件系统、编译器中的语法分析等。 以上是Java中关于的一些重要的知识点。熟练掌握这些知识,可以帮助程序员更好地设计和实现各种数据结构和算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值