软件设计师考点七之数据结构与算法

  • 数组与矩阵(❤❤)
  • 稀疏矩阵
  • 线性表(❤❤❤❤❤)
  • 广义表(❤❤)
  • 树与二叉树(❤❤❤❤❤)
  • 相关术语
  • 二叉树重要特性
  • 二叉树遍历
  • 反向构造二叉树
  • 树转二叉树
  • 查找二叉树
  • 平衡二叉树
  • 图(❤❤)
  • 基本概念
  • 邻接矩阵
  • 图的存储
  • 图的遍历
  • 拓扑排序
  • 图的最小生成树
  • 排序与查找(❤❤❤❤❤)
  • 算法基础及常见的算法(❤❤❤❤❤)
  • 参考链接


数组与矩阵(❤❤)

稀疏矩阵

  • 上三角矩阵
    在矩阵中下标分别为i和j的元素,一维数组的下标计算公式:(2n-i+1) x i/2 + j
  • 下三角矩阵
    在矩阵中下标分别为i和j的元素,对应的一维数组的下标计算公式为:(i+1) X i/2 + j

线性表(❤❤❤❤❤)

广义表(❤❤)

树与二叉树(❤❤❤❤❤)

相关术语

  • 节点(node)
    每个元素称为节点
  • 根节点或树根(root)
    有一个特定的节点被称为根节点或树根
  • 节点的度
    一个节点含有的子树的个数称为该节点的度(节点下面有几个叉)
  • 叶节点或终端节点
    度为0的节点称为叶节点
  • 分支节点或非终端节点
    度不为0的节点
  • 双亲节点或父节点
    若一个节点含有子节点,则这个节点称为其子节点的父节点
  • 孩子节点或子节点
    一个节点含有的子树的根节点称为该节点的子节点
  • 兄弟节点
    具有相同父节点的节点互称为兄弟节点
  • 树的度(Degree)
    一棵树中,最大的节点的度称为树的度
    称度为m的树为m叉树
  • 节点的层次
    从根开始定义起,根为第一层,根的子节点为第二层
  • 树的高度或深度
    树中节点的最大层次
  • 堂兄弟节点
    双亲在同一层的节点互为堂兄弟
  • 节点的祖先
    从根到该节点所经分支上的所有节点
  • 子孙
    以某节点为根的子树中任一节点都称为该节点的子孙
  • 森林
    由m(m>=0) 棵互不相交的树的集合称为森林

二叉树重要特性

  • 二叉树分类
  • 常用公式
  1. 在二叉树的第i层最多有 2^(i-1) 个节点(i>=1)
  2. 深度为k的二叉树最多有 (2^k) - 1 个节点(k>=1)
  3. 对任何一棵二叉树,如果其叶子节点数为n0,度为2的节点数为n2,则n0 = n2 + 1

二叉树遍历

  • 先序遍历(DLR)
    根节点 -> 左子树 -> 右子树
public static void DLR(BinaryNode node) {
        // 访问根节点
        System.out.print(node.data + " ");
        // 遍历左子树
        if (node.left != null) {
            DLR(node.left);
        }
        // 遍历右子树
        if (node.right != null) {
            DLR(node.right);
        }
    }
  • 中序遍历(LDR)
    左子树 -> 根节点 -> 右子树
public static void LDR(BinaryNode node) {
        
        // 遍历左子树
        if (node.left != null) {
            LDR(node.left);
        }

        // 访问根节点
        System.out.print(node.data + " ");

        // 遍历右子树
        if (node.right != null) {
            LDR(node.right);
        }

    }
  • 后序遍历(LRD)
    左子树 -> 右子树 -> 根节点
public static void LRD(BinaryNode node) {
        // 遍历左子树
        if (node.left != null) {
            LRD(node.left);
        }

        // 遍历右子树
        if (node.right != null) {
            LRD(node.right);
        }

        // 访问根节点    
        System.out.print(node.data + " ");
    }

反向构造二叉树

  • 构造原则
  1. 有前序、中序可以反向构造
  2. 有中序、后序可以反向构造
  3. 只有前序、后序不能构造
  • 构造样例

树转二叉树

查找二叉树

  • 特点
    左孩子节点小于根,右孩子节点大于根

平衡二叉树

  • 特点
  1. 任意节点的左右子树深度相差不超过1;
  2. 每个节点的平衡度只能为-1、0或1

图(❤❤)

基本概念

  • 完全图

在无向图中,若每对顶点之间都有一条边相连,则称该图为完全图

在有向图中,若每对顶点之间都有两条有向边相互连接,则称该图为完全图

邻接矩阵

  • 表示方式
    用一个n阶方阵R来存放图中各结点的关联信息,其矩阵元素Rij定义方式:
  1. 若顶点i到顶点j有邻接边,则Rij = 1
  2. 若顶点i到顶点j无邻接边,则Rij = 0

注意:若图的节点为n,边最少为n-1

844数据结构与算法是什么 877数据结构与算法分析_最小生成树

图的存储

  • 注意事项
    邻接矩阵大小取决于节点数量
  • 邻接表
    首先把每个顶点的邻接顶点用链表示出来,然后用一个一堆数组来顺序存储上面每个链表的头指针。

图的遍历

  • 遍历方法
    深度优先、广度优先

拓扑排序

  • AOV网络
    我们把用有向边表示活动之间开始的先后关系。这种有向图称为用顶点表示活动网络,简称AOV网络

图的最小生成树

  • 树和图的最大区别
    不能形成环
  • 常用算法

普里姆算法(Prim)

  • 更适合与解决边的绸密度更高的连通网
    具体思路是:普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类)
    对于给定的连通网,起始状态全部顶点都归为 B 类。在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类;然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止。所走过的顶点和边就是该连通图的最小生成树。

克鲁斯卡尔算法(Kruskal)

  • 更适合于求边稀疏的网的最小生成树
    具体思路是:将所有边按照权值的大小进行升序排序,然后从小到大一一判断,条件为:如果这个边不会与之前选择的所有边组成回路,就可以作为最小生成树的一部分;反之,舍去。直到具有 n 个顶点的连通网筛选出来 n-1 条边为止。筛选出来的边和所有的顶点构成此连通网的最小生成树。

排序与查找(❤❤❤❤❤)

算法基础及常见的算法(❤❤❤❤❤)