二叉树就是结点相连形成的一种结构,是用来解决哈希冲突的有效方法链表会很长,那么就会导致查询效率就低了。
根据key的hash值来计算出来的位置可能是相同的,如果同一个元素放在同一个位置过多的话,查询就会很麻烦,需要用到二叉树。
1.1 二叉树的基本概念
二叉树(Binary tree)是树形结构的一个重要类型。
二叉树特点是每个结点最多只能有两棵子树,且有左右之分。
1.1 二叉树的遍历
-
前序遍历:中左右(根左右)
-
中序遍历:左中右(左根右)
-
后序遍历:左右中(左右根)
-
前序遍历:ABDHIECFG
中序遍历:HDIBEAFCG
后序遍历:HIDEBFGCA
1.3 经典二叉树
1、满二叉树: 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。 第n层的结点数是2的n-1次方,总的结点个数是2的n次方-1
2、完全二叉树: 叶结点只能出现在最底层的两层,且最底层叶结点均处于次底层叶结点的左侧。
3、平衡二叉树:平衡二叉树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树, 但不要求非叶节点都有两个子结点 。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。例如红黑树的要求:
-
节点是红色或者黑色
-
根节点是黑色
-
每个叶子的节点都是黑色的空节点(NULL)
-
每个红色节点的两个子节点都是黑色的。
-
从任意节点到其每个叶子的所有路径都包含相同的黑色节点数量。
当我们插入或删除节点时,可能会破坏已有的红黑树,使得它不满足以上5个要求,那么此时就需要进行处理:
1、recolor :将某个节点变红或变黑
2、rotation :将红黑树某些结点分支进行旋转(左旋或右旋)
使得它继续满足以上以上的5个要求。
例如:插入了结点21之后,红黑树处理成:
在链表里什么时候形成红黑树结构呢:
当同一个位置的元素满足8,并且列表长度大于6,再增加时就会形成红黑树型结构 。
哈希表的table数组的默认长度是16,之后扩容都是2倍扩容,永远是2的n次方。同一个位置元素达到8时,长度没到64就会产生扩容。