本文不会对具体细节过多的探究,力求得到这几种树的联系以及区别,实际运用。
BST(二叉检索树):
二叉检索树也是我们最熟悉的一个索引方式了,它保证所有节点的左子树都小于该节点,所有节点的右子树都大于该节点。就可以通过大小比较关系来进行快速的检索,在一棵满二叉平衡树的情况下,检索的效率可以达到logn(类似二分检索),然后插入和删除的效率也是稳定的logn。
还是上一张图吧:
BST可以很多题目相关考察的重点,这里要注意:如何找BST的最低公开节点,BST的中序遍历得到的结果是递增序列。
这里要讲一下BST的一个缺点,由于BST没有相关措施保持平衡,很容易因为插入数据的不对导致树的不平衡,当极度不平衡的时候,BST就会退化成一个链表,搜索的速度自然也就降低到了N,相关维护的代价也高(要想插入和删除,前提是要找到该节点)。
AVL树:
AVL树解决了BST中容易出现不平衡的问题,通过旋转的手段来让BST保持满二叉树的性质,当插入一个新节点之后,从插入结点向上判断是否出现高度差超过2的结点,然后通过旋转来恢复平衡,具体的平衡规则可以看我这篇博客:
https://blog.csdn.net/github_33873969/article/details/79487199
AVL树有一个缺点就是维护的代价过高,相较于BST,AVL树要有一个保持平衡的旋转操作,并且要保持严格平衡,所以维护代码高。
红黑树:
红黑树是我这篇文章要说的一个重点,我们的stl中的map也是低层也是通过红黑树来实现的,先说下红黑树的5个基本原则吧:
红黑树首先是二叉平衡树
1.每个结点或是红色的,或是黑色的。
2.根结点是黑色的。
3.每个叶结点(NIL)是黑色的。
4.如果一个结点是红色的,则它的两个子结点都是黑色的。