树状结构基础知识

253 阅读3分钟

首先了解下树的概念,这是了解红黑树的基础,红黑树是java中treeMap和hashMap的底层,因此先学习树的基本知识为后面的源码解读做准备。

度为2的树称为二叉树,是我们的研究对象

image.png

这是一颗满二叉树

image.png

下面是一颗完全二叉树

image.png

前面都是为了做铺垫的概念,真正和程序相关联的首先是 BST 二叉搜索树(又称为二叉排序树),BST要求任何一个非叶子节点,左子节点的权比父节点的权小,右子节点的权比父节点权大

image.png

BST 的深度优先遍历 ----- 这里只举例深度优先遍历

二叉搜索树的深度遍历分为:先序遍历、中序遍历、后序遍历
先序遍历: 根节点、左子树、右子树
中序遍历: 左子树、根节点、右子树 --中序遍历的结果是有序的
后序遍历: 左子树、右子树、根节点

上图先序遍历输出结果: 10 8 6 9 12 11 13 上图中序遍历输出结果: 6 8 9 10 11 12 13 上图后序遍历输出结果: 6 9 8 10 11 13 12

在某些极端特殊情况下,二叉搜索树会产生问题,由于左小右大的特点, 例如 1,2,3,4,5,6创建一颗二叉搜索树时更像是一个单链表。 那么查询效率就会显著降低,因此衍生了平衡二叉树。

平衡二叉树

  • 平衡二叉树也叫平衡二叉搜索树,它满足二叉搜索树的所有特征。
  • 任意一个节点的平衡因子的绝对值不能大于1
    某节点的高度值= Math.max(左子树高,右子树高)+1 平衡二叉树有一个平衡因子的概念: 某个节点的左子树和右子树高度值的差称为平衡因子

image.png

向上图中添加一个新的节点 3,使得平衡二叉树不再平衡,此时需要维护平衡

image.png 找到新增节点的所在路径 从叶子节点递归计算平衡因子,找到不平衡的节点,不平衡节点在左边则右旋在右边则左旋, 当树的深度较深时,不平衡节点在树的左子树的右边则先左旋再右旋,反之则先右旋再左旋。

红黑树的定义

  • 红黑树的叶子节点指的是最后的空节点,想象下 叶子节点的孩子节点
  • 红黑树的每个节点都有颜色表示,要么红色要么黑色
  • 根节点一定是黑色的
  • 每个叶子节点一定是黑色的
  • 如果一个节点是红色的那么他的孩子节点一定是黑色的
  • 任意节点到叶子节点所经过的黑色节点是一样的

2-3树的定义

  • 每个节点可以存放一个或两个元素
  • 存放一个元素的节点称为2-节点,存放两个元素的节点称为3-节点
  • 每个节点都有2个或3个子节点的树称为2-3树,2-3树满足BST的基本特征
  • 2-3树是一个绝对平衡的树 2-3树添加节点的前提是需要维护绝对平衡:
    满足二叉搜索树的特征
    维持绝对平衡
    不能往null节点插入数据

image.png

2-3树和红黑树的等价性

image.png

红黑树添加元素保持根是黑色的