树
1.二叉树
2.平衡二叉树
- 非叶子节点至多拥有拥有两个子节点
- 右边的值大于根节点的值,左节点的值小于根节点
- 左右层数相差不多于1
- 没有值相等重复的节点
判断一个二叉树是否平衡:
method 1:分别对左右节点计算深度,比较深度的差值,但是这样会有会重复计算,复杂度较大。
method 2: 采用后序遍历的思想,先计算左子树的深度,再计算右子树的深度,分别判断内部,这样就能够知道父节点是否平衡,只需要一次遍历。
public boolean isBalanceTree(Node node){ int depth = 0; return isBalanced(node,depth); } public boolean isBalanced(Node node, int depth){ if(node == null){ depth =0; return true; } int left = 0; int right = 0; if(isBalanced(node.left,left) && isBalanced(node.right,right)){ int diff = left - right; if(diff >= -1 && diff <= 1){ depth = 1+(left > right ? left : right); return true; } } return false; }
3.B树 m路 一般用于文件索引 (平衡多路查找树) B-
- 每个节点至多拥有m个字节点
- 根节点至少拥有2个子树
- 除了根节点,其余每个分支节点至少拥有m/2节点
- 所有的叶节点都在同一层
- 每个节点拥有的关键字,个数为ceil(m/2)-1 -- m-1个,关键字的顺序递增
- 有k个子树的节点拥有k-1个关键码
4.B+树
- B+树的所有数据均存在叶子节点中,分支结构均为索引,只需扫描叶子节点。 一般用于数据库索引
- 分支范围[2,m]
- 每个节点包含的[ceil(m/2),m]个分支。
- 所有叶子节点都在同一层
区别:
- B+树关键字的个数和叶子节点的个数相同。
- B+树不保存非关键字记录的指针,只保存索引,所有的数据地址要到叶节点才能获得。
5.B*树 B*在B+树的基础上,B*树的关键字个数为ceil(2/3*m)
当关键字的个数大于时不会首先进行分裂,而是向周围的兄弟节点,若兄弟节点的关键字个数不足,则会给兄弟节点。