一、Tree介绍

 

  无论是链表,栈还是队列,它们都是线性结构的,每个节点的左边最多一个节点,右边也最多一个节点,对于大量的输入数据,线性表的访问时间太慢,不宜使用。这里我要说一种非线性的数据结构,其大部分操作的运行时间平均为O(logn)。

父结点比较存放下去就行成了一棵树(每个结点最多有两个子结点的树)状结构。只因这种结构在做索引会提高一倍的时间,大大提高了查询效率。这也是Tree结构的主要作用。

 

  二、Tree分类

Tree可分为BTree、B-Tree、B+Tree、B*Tree、红黑树等

1,BTree又叫二叉树又可分为:普通二叉树(二叉查找树)、平衡二叉树(Balanced Binary Tree)

1.1普通二叉树也就是线性的数据结构,真正失去了所说的tree的特点。

1.2平衡二叉树(Balanced Binary Tree)它是G.M. Adelson-Velsky 和 E.M. Landis在1962年在论文中发表的,因此又叫AVL树接着来了解一下AVL树的特性:一棵AVL树是其每个结点的左子树和右子树的高度最多相差1的二叉查找树(空树的高度为-1),这个差值也称为平衡因子(其取值可以是1,0,-1,平衡因子是某个结点左右子树层数的差值,有的书上定义是左边减去右边,有的书上定义是右边减去左边,这样可能会有正负的区别,但是这个并不影响我们对平衡二叉树的讨论)。可以根据平衡因子知道该树是不是平衡二叉树。平衡二叉树主要用于数据库(如mysql)索引起到快速检索作用。

Q1,在数据存储时如何保证生成的树状是平衡的?

根据平衡策略实现,有多种实现方式 AVL和红黑树只是两种实现形式。

Q2,插入/删除数据使原树结构失去平衡如何解决?

如果发生这样的情况,我们就必须考虑删除元素后恢复二叉树的平衡性质,实际上也总是可以通过对树进行简单的修复来让其重新恢复到平衡,而这样的简单操作我们就称之为旋转。如果失衡点为X

① 在结点X的左孩子结点的左子树中插入/删除元素 
② 在结点X的左孩子结点的右子树中插入/删除元素 
③ 在结点X的右孩子结点的左子树中插入/删除元素 
④ 在结点X的右孩子结点的右子树中插入/删除元素 
以上4种情况,其中第①情况和第④情况是对称的,可以通过单旋转来解决,而第②种情况和第③情况是对称的,需要双旋转来解决.

 

2,红黑树(Red Black Tree) 是一种自平衡二叉查找树,它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。

红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。

红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。

因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持)

 

3,B-Tree、B+Tree、B*Tree请见