数据结构

1. 数据存储(物理)结构

  • 顺序

    把逻辑上相邻的结点按顺序存储在物理上相邻的连续存储单元中,结点逻辑关系由存储单元的邻接关系体现。查找快,插入、删除慢。

  • 链式

    用一组任意的存储单元存储逻辑上相邻的结点(存储单元可以连续也可以不连续),逻辑关系记录在指针域中。查找慢,插入、删除快。

  • 哈希(散列)

    根据存储数据的内容计算哈希值来决定存储地址,根据内容查找时快

  • 索引

    另外设置一个索引表来存储结点的地址,分开存放数据结点和结点逻辑关系

2. 数据逻辑结构

  • 集合

    无序、不重复的元素构成集合

  • 线性

    具有唯一前驱和唯一后继的“一对一”关系的有序线性结构

  • 树形

    具有唯一前驱但可以有一个或多个后继的“一对多”关系的树形结构

  • 图形

    具有多个前驱和多个后继的“多对多”关系的图形结构

3. 表、堆、栈和队列

  • 具有线性逻辑结构的就是线性表简称表,线性表又根据不同的物理实现方式分为:顺序表、链表。

  • 堆是一种经过排序的树形结构。根结点最大的,父结点比子结点大的叫最大堆;根结点最小的叫最小堆。

  • 栈是只允许在栈顶进行插入和删除操作的特殊线性表,栈又根据不同的物理实现方式分为:顺序栈、链式栈。具有“后进先出”的特性

  • 队列

    队列是只允许在队尾插入,在队首删除的特殊线性表,队列又根据不同的物理实现方式分为:顺序队列、链式队列。具有“先进先出”的特性

4. 二叉树的深度

当前结点的深度为左右子树深度较大的值+1

class BinaryTreeNode<T> {
    var data: T
    var left: BinaryTreeNode?
    var right: BinaryTreeNode?
    init(_ data: T, _ left: BinaryTreeNode? = nil, _ right: BinaryTreeNode? = nil) {
        self.data = data
        self.left = left
        self.right = right
    }
}

func depth<T>(_ node: BinaryTreeNode<T>?) -> Int {
    guard let node = node else { return 0 }

    let left = depth(node.left) + 1
    let right = depth(node.right) + 1

    return left > right ? left : right
}