1.二叉树
特殊的二叉树有:
1 1
/ \ / \
1 1 1 1
/ \ / \ / \
1 1 1 1 1 1
满二叉树 完全二叉树
从图就可看出,满二叉树是一个绝对的三角形,而完全二叉树是一个右下角可能有缺口的三角形。
二叉树的增、查都很easy。删的话分三种情况:
①叶子节点的删操作,easy,不解释;
②仅有左子树或仅有右子树节点的删操作,easy,不解释;
③既有左子树,又有右子树节点的删操作。需要找到前驱(左子树中最大的数)或者后继(右子树中最小的数)来替换被删的该节点。
关于二叉树的遍历,只要记住三句话:
前序遍历:根、左、右;
中序遍历:左、根、右;
后序遍历:左、右、根。
关键:这里的前中后是以根为参照对象而言。
做道题感受下:
前序遍历结果:ABDGHCEIF
中序遍历结果:GDHBAEICF
后序遍历结果:GHDBIEFCA
2.B树(即B-树)
①阶数M=max(儿子数)=max(关键字数)+1 ; 儿子数=指针数=子节点树=关键字数+1
②关键字数量限制:根节点[1,M-1] 非根非叶子节点[cell(M/2)-1,M-1]
③关键字集合遍布整棵树,任何关键字只出现一次,故搜索可能在非叶子节点结束
做一道练习题来消化一下:https://blog.csdn.net/li_canhui/article/details/85305147
题目:设定B-树的阶为5,用关键字序列{1,2,6,7,11,4,8,13,10,5,17,9,16,20,3,12,14,18,19,15}来构建一棵B-树。
答案:Key:一步一步来,就像往上爬楼梯
3.B+树
根B树有点类似,但是!淡化了很多概念:
①阶数M=max(儿子数) ; 儿子数=指针数=子节点树=关键字数
②关键字数量限制:根节点[1,M] 非根非叶子节点[cell(M/2),M]
③所有关键字都在叶子节点出现,关键字可能不只出现一次,故搜索一定在叶子节点结束
④须注意,非叶子节点里也可出现非关键字!
用一个例子(取自 谢兴生《高级数据库》)感受一下B+树增、删操作:
原树长这样:
插入8后,长这样:
删除19,2;再删除24后长这样:
至于B+树的构建过程,比较复杂,先不做描述,可参考 谢兴生《高级数据库》,158页。