- 连续的内存空间
- 相同类型的数据
线性查找的时间复杂度:
二分查找的时间复杂度:
对任一节点而言,其左子树的所有节点都小于该节点,其右子树的所有节点都大于该节点
查找值为7的节点:
时间复杂度O(logn)
但是
如果存在极端情况,每次节点插入时都是最大或最小的元素,那么二叉查找树就退变成一条链表啦😱
这样查找的时间复杂度最坏情况下就变成了O(n)
不行要做出改变!
- 同样具有二叉查找树的特性
- “平衡”,对任一节点而言,左右子树的高度差不超过1
增加或删除元素时,通过左旋、右旋操作维持平衡
首先找到其左右子树失衡的节点,例如下图中节点9的左右子树失衡了,高度差超过1
左旋:失衡节点指向其右孩子的左孩子
右旋:失衡节点指向其左孩子的右孩子
节点不是黑色就是红色
根节点一定是黑色
叶子节点(NIL)一定是黑色
每个红色节点的两个子节点都为黑色(从每个叶子到根的所有路径上不能有两个连续的红色节点)
从任一节点到其每个叶子节点NIL的所有路径,都包含相同数目的黑色节点(黑高)
查找、插入、删除的时间复杂度为O(logn)
一般在插入红黑树节点的时候,会将这个节点设置为红色,?红色破坏原则的可能性最小,如果是黑色, 很可能导致这条支路的黑色节点比其它支路的要多1,破坏了平衡。
AVL树的平衡比较严格,在进行频繁的插入删除操作时,为了保持左右子树的高度差不超过1的平衡条件,需要进行频繁的旋转操作来维持平衡。与AVL树相比,红黑树牺牲了部分平衡性,以换取插入/删除操作时较少的旋转操作,整体来说性能要优于AVL树。