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)

当关键字的个数大于时不会首先进行分裂,而是向周围的兄弟节点,若兄弟节点的关键字个数不足,则会给兄弟节点。

posted @ 2018-03-25 11:21  bounce  阅读(168)  评论(0编辑  收藏  举报