二叉搜索树
一、定义
平衡树实际为一种二叉搜索树(BST)。
对于一棵BST满足如下定义:
- 空树为一棵BST。
- 若根左子树非空,则左子树键值均小于根节点。
- 若根右子树非空,则右子树键值均大于根节点。
- 根左子树与右子树均为BST。
二、插入操作
从根节点出发,让插入元素与当前节点键值进行比较,小于则向左递归,大于则向右递归,重复如此操作,直到找到合适的位置。
但若插入元素与某一节点键值相等该如何处理?对于严格BST,我们禁止出现重复键值,但我们可以进行处理:
- 若元素大于等于则向右递归(或小于等于向左),但当出现大量重复元素会导致树的平衡性出现问题。
- 我们可以给每个节点添加一个计数,当递归到重复键值节点,则当前节点计数加一(下文均以此方式进行插入,不做过多赘述)。
三、删除操作
设删除节点计数为cnt,若cnt==0,则并不存在此节点,若cnt>1,则cnt--即可。
否则
- 若为叶子节点,直接删除。
- 若为只有一个儿子的链节点,用儿子顶替。
- 若有两个儿子,用左子树最大键值节点(或右子树最小键值节点)\(u\)的键值替换删除节点,易得\(u\)至多有一个子节点,即为链节点或叶子结点,对\(u\)进行删除操作即可。
四、查询操作
对于二叉搜索树进行中序遍历,得到的中序遍历序列中元素按升序排列,再简单对重复元素的cnt进行处理,即可得到每一个元素的排名。
反过来通过排名如何求元素(下文计l=k-count,r=k-1,用\(|V|\)表示节点数量)。
- 从根节点出发,若\(|左子树|>r\),则该元素在左子树中。
- 若\(|左子树|\in[l,r]\),则该元素为根节点。
- 否则\(|左子树|<l\),则该元素在右子树中。
- 向下递归即可。

浙公网安备 33010602011771号