一、二叉搜索树
- 所谓二叉搜索树,可提供对数时间的元素插入和访问
- 节点放置规则:任何节点的键值一定大于其左子树的每一个节点的键值;并小于其右子树中的每一个节点的键值
- 最大值、最小值:
- 最小值:从根节点出发,一直往左走,直至无左路可走,即得到最小元素
- 最大值:从根节点出发,一直往右走,直至无右路可走,即得到最大元素
二叉搜索树的查找
- 从根节点出发,根据值的大小,逐个向左或向右查找,就可以查找到元素
二叉搜索树的插入
- 插入新元素时,从根节点开始,遇键值较大者就向左,遇键值较小者就向右,一直到尾端,即为插入点
二叉搜索树的删除
- 如果要删除的节点只有一个子节点:直接将其子节点连至其父节点即可。例如下面第一张图删除节点15
- 如果要删除的节点有二个子节点:以右子树中的最小节点代替删除节点(从删除节点的右子节点开始开始一直向左即可找到)。例如下面第二张图删除节点12
二、平衡二叉树(平衡二叉搜索树)
- 如果因为输入值不够随机,或者经过某些插入和删除操作,二叉搜索树可能会失去平衡,造成搜寻效率低落的情况,如下图所示
- 树是否平衡,没有一个绝对的测量标准。“平衡”的大致意义是:没有任何一个节点过深(深度过大)
- 不同的平衡条件,造就出不同的效率表现,以及不同的实现复杂度。有数种特殊结构如AVL-tree、RB-tree、AA-tree,均可显示平衡二叉搜索树,它们都比一般的二叉搜索树复杂,因此,插入节点和删除节点的平均时间也比较长,但是它们可以避免极难应付的最坏(高度不平衡)情况,而且由于它们总是保持某种程序的平衡,所以元素的访问时间平均而言也就比较少,一般而言其搜索时间可节省25%左右
- 关联式容器的内部结构是一个balanced vinary tree(平衡二叉树)
- 平衡二叉树的种类很多,包括AVL-tree、RB-tree、AA-tree等。其中广泛运用于STL的是RB-tree(红黑树)