二叉查找树基础
二叉查找树是指一种满足以下性质的二叉树:
1. 对于每个节点X,该节点的所有左子树节点关键字值小于该节点关键字值
2. 该节点的所有右子树节点关键字值大于该节点关键字值
3. 关键字需要支持“>”、“<”、“==”运算符
对于二叉树ADT,一般需要提供如下操作:
- 清空二叉查找树:MakeEmpty
- 查找某个节点:Find
- 删除某个节点:DeleteElement
- 查找最大值:FindMax
- 查找最小值:FindMin
- 插入一个节点:InsertElement
二叉查找树的平均深度为O(log(N)),不过如果插入元素序列递增或者递减,二叉查找树将退化成单链表。
二叉查找树的实现
由于二叉查找树是一种统一排序的查找树,在进行删除插入时需要保持排序关系,以下为二叉查找树的基本结构定义:
1 | template <typename DataType> |
如上所示,二叉查找树的基本数据成员为根节点,初始化为空指针,通过插入节点函数建立二叉查找树,以下为各函数实现:
- 递归清空核心函数
1 | template <typename DataType> |
- 递归清空入口函数,调用清空核心函数
1 | template <typename DataType> |
- 非递归清空函数,采用某种非递归遍历函数思想即可
1 | template <typename DataType> |
- 递归查找核心函数
1 | template <typename DataType> |
- 递归查找某个元素
1 | template <typename DataType> |
- 非递归查找
1 | template <typename DataType> |
- 递归删除节点函数核心函数
1 | template <typename DataType> |
删除一个节点,删除节点需要十分小心,删除需要分为几种情况讨论:
- 第一种,叶节点,直接删除即可
- 第二种,只有左子节点,直接父节点重新定向到左子节点
- 第三种,只有右子节点,也是直接父节点重定向到右子节点
- 第四种,有两个子节点,由于该节点值大于左子树而小于右子树,因此可以用左子树的最大值或者右子树的最小值交换,然后删除交换点,改点情况是1~3种情况的一种,即需要删除两次
1 | template <typename DataType> |
- 递归查找最大元素核心函数
1 | template <typename DataType> |
- 递归查找最大元素
1 | template <typename DataType> |
- 非递归查找最大元素
1 | template <typename DataType> |
- 递归查找最小元素核心函数
1 | template <typename DataType> |
- 递归查找最小元素
1 | template <typename DataType> |
- 非递归查找最小元素
1 | template <typename DataType> |
- 非递归插入一个元素,返回位置
1 | template <typename DataType> |
- 析构函数
1 | template <typename DataType> |