二叉树,二叉搜索树,avl树,b树,b+树,b*树

一、二叉树

树的每个节点最多有两个子树。

树的高度和深度:b的高度是3(从B到叶节点的最长路径),b的深度是2(从根节点到B的路径长度)。

完全二叉树:除第 h(叶子层) 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边。如下图

满二叉树:每一层的节点数都达到最大值。

树的遍历:前序遍历(NLR,先根节点,然后左右子树),中序遍历(LNR),后续遍历(LRN)。

二、二叉排序树

二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:
①若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
②若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
③左、右子树本身又各是一棵二叉排序树。

实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉排序树定义中BST性质(1)里的"小于"改为"大于等于",或将BST性质(2)里的"大于"改为"小于等于",甚至可同时修改这两个性质。

按中序遍历该树所得到的中序序列是一个递增有序序列

 

因为二叉查找树可以任意构造,在某种特殊情况下退化成一个链表,导致查询效率的降低。因此出现AVL树。

三、AVL树

AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。

AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,

在插入和删除的时候,会失衡,因此需要旋转。旋转方法见第一个参考链接。如1,3,2,4,5,8

 

四、B树(B 通常解释为balance,B-树)

平衡多路查找树。m(m>=3)阶树。当m=2时,不符合b树的定义(若根节点不是叶子节点,则至少有2个孩子)

插入的时间复杂度:n(logm+logm-1

示例见链接3.

插入的时候,可能会分裂。规则如下:

插入的元素的位置一定是叶子节点.
查找到要插入的叶子,插入
1)不失衡,结束
2)失衡->分裂
     将该节点从最中间元素分成三个,且该元素成为父节点一关键字,左右分别成为孩子
     如果父节点失衡,则依次向上分裂直到不失衡

 

删除的时候,比较复杂,需要借。规则如下:

1) 最下层元素
1.本身节点够删除->直接删除
2.本身节点不够->兄弟够借
删除,同时将父亲一个的移下来,兄弟的一个移上去
3.兄弟的也不够删除
自己,兄弟,父亲一个节点合并,放在一起.
父亲删除所用节点(将父亲层看成最下层元素,重复1.2.3.删除,直到不失衡)
2) 非最下层元素=>转成最下层元素删除
方法:将自己孩子的一个最下层的一个节点替换掉自己,再删除那个节点.
即:将左孩子的最右节点,或者右孩子的最左节点替换掉自己.

 

 

五、B+树

相对于b树,b+树所有的节点都可以在叶子节点找到。

 

六、B*树

B+树的非根和非叶子结点再增加指向兄弟的指针

B*树在插入的时候,回像兄弟借节点。这是丰满的B+树。

 

参考链接:

http://blog.csdn.net/u013235478/article/details/50625677

http://blog.csdn.net/sysu_arui/article/details/7897017

http://blog.csdn.net/v_JULY_v/article/details/6530142/

posted @ 2017-08-27 20:03  熊猫晶晶  阅读(607)  评论(0编辑  收藏  举报