目录
前言
哈喽,小伙伴们大家好。今天我来给大家介绍一种新的二叉树结构——搜索二叉树。搜索二叉树是后面学习AVL树和红黑树的基础,学好它对于后面学习一些复杂的数据结构很有帮助。那么事不宜迟,我们赶快开始吧。
一、二叉搜索树概念
二叉搜索树又称二叉排序树,它或者是一棵空树,或者遵循以下特征:
- 如果它的左子树不为空,则左子树上节点的所有值都要小于根节点。
- 如果它的右子树不为空,则右子树上节点的所有制都要大于根节点。
- 左右子树也同样是二叉搜索树。
- 二叉搜索树中的节点不能有相同的值。
二叉树节点代码如下:
template<class T>
struct BSTreeNode
{
BSTreeNode(const T& key)
:_left(nullptr)
,_right(nullptr)
,_key(key)
{
}
BSTreeNode<T>* _left;
BSTreeNode<T>* _right;
T _key;
};
二、二叉搜索树的操作
1、查找
- 从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。
- 最多查找高度次,走到到空,还没找到,这个值不存在。
代码如下:
Node* find(const T& key)
{
Node* cur = _root;
while (cur)
{
if (key < cur->_key)
{
cur = cur->_left;
}
else if (key > cur->_key)
{
cur = cur->right;
}
else
{
return cur;
}
}
}
2、插入
2.1插入非递归实现
- 树为空,则直接插入节点,赋值给root指针。
- 树不为空,则根据要插入节点数值的大小,依靠搜索二叉树的特性找到合适的位置插入。
代码如下:
bool insert(const T& key)
{
if (_root == nullptr)
{
_root = new Node(key);
return true;
}
else
{
Node*temp=new Node(key);
Node* cur = _root;
Node* parent = cur;
//去找合适的插入位置,直到遇到空截至
while (cur)
{
parent = cur;//把上一个节点保存起来,方便找到空后连接
if (key < cur->_key)
{
cur = cur->_left;
}
else if (key > cur->_key)
{
cur &