面试常见的数据结构类型

1. B树和B+树 性质及区别

参考阅读—B树与B+树

1.1 B树(B-树)

m 阶的B树性质:

  • 每个结点至多拥有m棵子树;
  • 根结点至少拥有两颗子树(存在子树的情况下);
  • 除了根结点以外,其余每个分支结点至少拥有 m/2 棵子树;
  • 所有的叶结点都在同一层上;
  • 有 k 棵子树的分支结点则存在 k-1 个关键码,关键码按照递增次序进行排列;
  • 关键字个数(查书吧)

1.2 B+树

1.3 红黑树

阅读参考—彻底理解红黑树

1.3.1 概念+性质
  • 平衡二叉查找树
  • 性质:
    a. 每个节点要么是黑色,要么是红色。
    b. 根节点是黑色。
    c. 每个叶节点(NIL)是黑色。
    d. 每个红色结点的两个子结点一定都是黑色。
    e.任意一结点到每个叶结点的路径都包含数量相同的黑结点。
    根据e推论
    如果一个结点存在黑子结点,那么该结点肯定有两个子结点
1.3.2 红黑树自平衡

(三种操作:左旋、右旋和变色)

  • 左旋

    左旋

  • 右旋

    右旋

  • 左旋只影响旋转结点和其右子树的结构,把右子树的结点往左子树挪了。
  • 右旋只影响旋转结点和其左子树的结构,把左子树的结点往右子树挪了。
  • 变色
    结点的颜色由红变黑或由黑变红
1.3.3 红黑树查找
  • 类似于平衡二叉树查找
  • 查找效率 O(log2n)


    二叉树查找流程
1.3.3 红黑树插入
  • 查找插入位置
  • 插入后自平衡
  • 从根结点开始查找;
  • 若根结点为空,那么插入结点作为根结点,结束。
  • 若根结点不为空,那么把根结点作为当前结点;
  • 若当前结点为null,返回当前结点的父结点,结束。
  • 若当前结点key等于查找key,那么该key所在结点就是插入结点,更新结点的值,结束。
  • 若当前结点key大于查找key,把当前结点的左子结点设置为当前结点,重复步骤4;
  • 若当前结点key小于查找key,把当前结点的右子结点设置为当前结点,重复步骤4;


    红黑树插入位置查找
  • 插入位置结点是红色
    红黑树插入情景
  • 除了情景2,所有插入操作都是在叶子结点进行的
1.3.3 红黑树删除
  • 查找删除位置

复用查找插入位置

  • 删除后自平衡
    三种情况:
  • 若删除结点无子结点,直接删除
  • 若删除结点只有一个子结点,用子结点替换删除结点
  • 若删除结点有两个子结点,用后继结点(大于删除结点的最小结点)替换删除结点


    删除所有情景

2. 排序算法

2.1 冒泡排序 ---O(n^2)

  • 算法思想: 两层for循环 一旦发现j比i小 要和i交换数据
public static void Bubble(int[] data){
        int len = data.length;
        if(len <2)
            return ;
        for(int i=0; i<len; i++){
            for(int j = i+1;j<len; j++){
                if(data[j]<data[i]){
                    int tmp = data[i];
                    data[i] = data[j];
                    data[j] = tmp;
                }
            }
        }
    }

2.2 快速排序----O(nlogn)

public static void quickSort(int[] arr, int left, int right){
       int len = arr.length;
       if(len <2 || left >= right || arr == null)
            return ;
        int mid = partition(arr, left, right);
        quickSort(arr, left, mid-1);
        quickSort(arr, mid +1, right);
   }
   public static int partition(int[] arr, int left, int right){
       int tmp = arr[left];
       while(left < right){
           while(left< right && tmp>= arr[right])
                right --;
           while(left< right && tmp< arr[left])
                left ++;
           int data = arr[left];
           arr[left] = arr[right];
           arr[right] = tmp;
       }
       return left;
   }

3. 平衡二叉树性质

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容