以下对数结构进行归类和简单说明,主要针对Java面试中常见的树结构进行概括。
树
定义:不包含回路的连通无向图
满足三个特性:
①不包含回路
②两个节点之间有且只有一条路径连通
③一棵树有N个节点,那一定有n-1条边
二叉树
含义:含义每个节点只有两个子节点的树,时间复杂度为O(log n)
完全二叉树
含义:二叉树的高度为h时,1~h-1层的节点数达到最大数,第h层从左往右连续缺少节点的二叉树
满二叉树
含义:每个叶子节点都存在同等深度的的完全二叉树
堆
含义:实质上就是完全二叉树,是一种满足父节点的值比子节点大(或者满足子节点的值比父节点的大)的完全二叉树
最小堆:父节点的值比子节点小
最大堆:子节点的值比父节点大
二叉查找树
含义:左子树所有的值小于等于父节点,右子树所有的值大于等于父节点,并且子树已排序
红黑树
含义:是一种特殊二叉查找树,也是不完全平衡的平衡二叉树。为了避免二叉查找树变成线性结构(树的深度过大),使用红黑树来保持插入节点时平衡每个子节点的节点数量。红黑树从根节点到叶子节点的最长路径不会超过最短路径的2倍。
使用场景: Java的集合中,TreeMap、TreeSet、HashMap(JDK 1.8)以红黑树实现
红黑树必须满足以下五点原则:
根节点是黑色
节点是红色或黑色
每个叶子节点都是黑色空节点(NIL节点)
从根节点到子节点的所有路径不能有连续的红色节点
从任一节点到其每个叶子的所有路径都包含相同数量的黑色节点
当新增节点时,破坏了红黑树的规则,则需要经过调整使其符合红黑树的五条原则。可以通过“变色”和“旋转”来调整二叉树。其中旋转分为左旋转和右旋转。左旋转,即右子树需要变动的旋转;右旋转,即左子树需要变动的旋转
插入新节点示例:
以上仅以简单的案例说明红黑树是如何保持自平衡,理解红黑树对节点数据的处理过程。
红黑树能够以O(log2 n) 的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。相比其他二叉树具有更高的性能。
参考资料:
二叉树 http://wiki.jikexueyuan.com/project/easy-learn-algorithm/binary-tree.html
红黑树 https://zhuanlan.zhihu.com/p/31805309