0%

数据结构之树(一)

基本概念

树,表示一对多的关系模型,比如父母和子女的关系,班级和学生的关系等

存储结构

  1. 双亲表示法,节点存储双亲,找父母容易,找孩子难
  2. 孩子表示法,节点存储孩子,找孩子容易,找父母难
  3. 孩子兄弟表示法,节点存储孩子和自己的兄弟,找孩子和兄弟容易,找父母难

二叉树

二叉树包括:

  1. 斜树,退化为一对一关系,此时为线性表
  2. 满二叉树,所有节点都有左子树和右子树,且所有叶子节点都在最下面一层
  3. 完全二叉树,按照从上到下,从左到右编号,不出现空档

二叉树的存储:对于完全二叉树,由于其定义严格,可用层序编号顺序存储,对于一般二叉树,可用孩子表示法:二叉链表存储

二叉树的遍历:

  1. 前序遍历:访问根节点,然后前序遍历左子树,和右子树
  2. 中序遍历:中序遍历左子树,访问根节点,中序遍历右子树
  3. 后序遍历:后序遍历左子树,和右子树,访问根节点
  4. 层序遍历:其实就是广度优先遍历

通过不同遍历方法,可以得到二叉树的次序,同样,通过特定遍历方法的次序,可以确定一棵树
二叉树的遍历本质上是将一个复杂的非线性结构转换为线性结构

树、森林和二叉树的转换

待研究

特殊的树

1. 二叉查找树

定义:每个节点的值都大于左子树任意节点,且小于右子树任意节点

删除操作:

  • 叶子节点:直接删除
  • 只有左子树或右子树:子树向上移动
  • 同时有左子树和右子树:将右子树中最小的节点移动到删除节点

平均情况:插入和查找性能都是$O(\log n)$
最坏情况:如果按照顺序或者逆序插入,会退化为链表,插入和查找性能都变为$O(n)$

性质:中序遍历结果为从小到大排列的序列

2. 平衡二叉树(AVL)

定义:在二叉排序树之上,限制任意节点的左右子树高度差最大为 1

为解决二叉查找树最坏情况退化为链表的性能问题,引入平衡二叉树,只要保持树的高始终小于$\log n$,则就能保证查找在最坏情况依然为$O(\log n)$

最小失衡树:在新插入节点向上查找,第一个不能平衡的子树

通过对最小失衡树的左旋或者右旋操作使树重新平衡。

2. 红黑树(AVL)

2-3 树:有两种节点,2-节点和 3-节点
2-节点:包含一个元素和两个子节点
3-节点:包含两个元素和三个子节点

插入操作:
2-节点,2-节点直接变为 3-节点,树的高度不变
3-节点,多余节点向父节点移动,如果父节点是 2-节点,则父节点变为 3-节点,高度不变

当原来的树中所有元素都为 3-节点时,由上可知,根节点由一个 3-节点分化为 3 个 2-节点子树,树的高度加 1

由此可见,2-3 树是向上增长,插入操作最坏情况性能是$O(\log n)$,而且始终保持平衡,因此,查找性能依然为$O(\log n)$

红黑树:本质就是 2-3 树,用颜色代替 3-节点的功能,便于代码操作

所有的 3-节点拆分为 2 个 2-节点,用红色标注 2 个中较小的那个节点

红黑树的性质:

  1. 保持根节点为黑色
  2. 如果一个节点是红色的,则它的子节点必须是黑色的

插入操作:通过左旋、右旋和颜色变换,实现平衡

五种情况:

  • 插入到一个 2-节点,且节点小于该 2-节点
  • 插入到一个 2-节点,且节点大于该 2-节点
  • 插入到一个 3-节点,且插入节点小于 3-节点的两个节点
  • 插入到一个 3-节点,且插入节点大于 3-节点的两个节点
  • 插入到一个 3-节点,且插入节点在 3-节点的两个节点之间

红黑树和平衡二叉树比较:
增删方面:红黑树性能优于平衡二叉树,红黑树任何不平衡,都能在 3 次旋转内得到解决
查找方面:平衡二叉树优于红黑树,因为平衡二叉树是严格平衡的,而红黑树在最坏情况下(红黑相间的斜树),查找性能是$O(2\log n)$

  1. 红黑树

4) 线索二叉树
线索二叉树:由于二叉链表存储的二叉树,有很多空指针的空间浪费,所以利用这些空指针存储节点的前驱或者后继,此时二叉树实际就变为一个双向链表

  1. 二叉树
  2. 二叉查找树
  3. 平衡二叉树
    3.1 平衡查找树之 AVL 树
    3.2 平衡二叉树之红黑树
  4. B 树
  5. B+树
  6. B*树
  7. Trie 树