二叉树,二叉搜索树,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(logmn +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