欢迎来到干货小仓库
"沙漠尽头必是绿洲。"
--面对技术难题时,坚持终会看到希望。
1.二叉搜索树的概念
二叉搜索树又称二叉排序树,它或者是一颗空树,或者是具有以下性质的二叉树:
a、若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。
b、若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。
c、它的左右子树也分别为二叉搜索树
2.二叉搜索树的查找
①从根开始比较,若查找的目标值比根大则往右子树中查找,比根小则往左边找。
②最多查找高度次,走到空还没找到,则这个值不存在。
循坏实现和递归实现
3.二叉搜索树的插入
a、若树为空,则直接新增节点,赋值给根(root)。
b、树不为空,则按二叉搜索树的规则走,比根节点大的 往右子树找,反之往左子树找,找到插入位置后,与该位置的父节点比较,看链接在左子树还是右子树。
c、当插入的数据,树中已有则插入失败。
4.二叉搜索树的删除
首先遍历二叉搜索树,看是否存在删除的值,不存在则直接返回false。
存在:主要分为两种情况
①该节点其左子树/右子树其中一个不为空或者都为空
②该节点其左子树和右子树都不为空。
第一种情况
第二种情况:要删除的节点的左右子树都不为空
方式一:与左子树的最右节点交换(左子树最大值)
方式二:与右子树的最左节点交换(右子树最小值)
非递归版本
//非递归
bool Erase(const K& key)
{
Node* cur = _root;
Node* parent = nullptr;
while (cur)
{
if (cur->_key > key)
{
parent = cur;
cur = cur->_left;
}
else if (cur->_key < key)
{
parent = cur;
cur = cur->_right;
}
//找到删除元素了
else
{ //左子树为空
if (cur->_left == nullptr)
{
//要删除的数据是根节点
if (cur == _root)
_root = _root->_right;
else
{
if (parent->_right == cur)
parent->_right = cur->_right;
else
parent->_left = cur->_right;
}
}
//右子树为空
else if (cur->_right == nullptr)
{ //要删除的数据是根节点
if (cur == _root)
{
_root = _root->_left;
}
else
{
if (parent->_right == cur)
parent->_right = cur->_left;
else
parent->_left = cur->_left;
}
}
//左右都不为空
else
{
//找左子树的最大值(其右子树必为空)
parent = cur;
Node* leftMax = cur->_left;
while (leftMax->_right != nullptr)
{
parent = leftMax;
leftMax = leftMax->_right;
}
swap(cur->_key, leftMax->_key);
if (parent->_left == leftMax)
parent->_left = leftMax->_left;
else
parent->_right = leftMax->_left;
cur = leftMax;
}
delete cur;
return true;
}
}
return false;
}
递归版本
觉得不错的可以点赞+收藏+关注奥!!!谢谢大家的支持