编程基础 - 二叉排序树 (Binary Search Tree)
本文将介绍二叉排序树的基础知识,并用C++实现主要方法。
在查看本文之前,需要一些数据结构和程序语言的基础,要对“树”的概念有一些了解。
其中的方法还需要熟悉“栈(stack)”、“队列(queue)”和“递归”。
文章目录
1 二叉排序树简述 (Introduction)
二叉排序树,也称二叉查找树和二叉搜索树,它可以是空树,或同时满足如下条件:
- 每个结点都有一个关键字(Key),做为查找依据;
- 左子树(非空):所有结点的关键字都小于根结点;
- 右子树(非空):所有结点的关键字都大于根结点;
- 左子树与右子树:都是二叉排序树;
- 对非空二叉排序树进行中序遍历,可以得到从小到大的顺序排列的关键字顺序。
注意:关键字是否可以重复,需要根据实际需求判断。
之后实例全部使用同一组数据:{ 50, 26, 78, 92, 33, 67, 22, 30, 32 }
2 二叉排序树的结构 (Structure)
它的结构和二叉树完全相同:
// 二叉排序树节点
template<typename T>
class BSTreeNode
{
public:
T element; // 数据
BSTreeNode<T>* leftChild; // 左指针
BSTreeNode<T>* rightChild; // 右指针
BSTreeNode(const T& e)
{
element = e;
leftChild = 0;
rightChild = 0;
}
~BSTreeNode()
{
leftChild = 0;
rightChild = 0;
}
};
3 二叉排序树的查找 (Search)
查找从根结点开始,逐层开始进行比较,直到找到目标或没有找到目标。且是一个递归的过程。
具体查找过程:
- (1)如果根结点为空,则查找不成功;
- (2)如果根结点不为空,进行比较:
- 如果等于根结点,查找成功;
- 如果小于根结点,则查找根结点的左子树;
- 如果大于根结点,则查找根结点的右子树;
- (3)查找成功时,指针将停留在结点;
- (4)查找不成功时,指针将为空。
下图展示了,查找36(蓝色),查找67(红色)的过程: