1. 搜索二叉树的定义
- 二叉搜索树又称二叉排序树,它可以是一棵空树,或者是具有以下性质的二叉树:
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 。
- 它的左右子树也分别为二叉搜索。
2.插入
- 情况1 : 树为空
直接插入 - 情况2:树不为空
从根节点开始判断,如果大于当前节点,则向右出发,否则向左。
3.删除
- 情况1:要删除的结点无孩子结点
说明删除的是叶子节点,可以直接删除。 - 情况2 :要删除的结点只有左孩子结点
删除当前节点,并使被删节点的父节点指向左孩子节点。 - 情况3:要删除的节点只有右孩子节点
删除当前节点,并使被删节点的父节点指向右孩子节点。 - 情况4:要删除的结点有左、右孩子结点
在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中, 再来处理该结点的删除问题。
4.实现
4.1 节点初始化
struct BSTNode
{
T _data;
BSTNode<T> * _left;
BSTNode<T> * _right;
BSTNode(const T& data = T())
:_left(nullptr)
,_right(nullptr)
,_data(data)
{}
};
4.2 插入
bool Insert(const T& data)
{
if (_root == nullptr)
{
_root = new Node(data);
return true;
}
PNode cur = _root;
PNode parent = nullptr;
while (cur)
{
parent = cur;
if (cur->_data == data)
return false;
else if (cur->_data > data)
cur = cur->_left;
else
cur = cur->_right;
}
cur = new Node(data);
if (parent->_data > data)
parent->_left = cur;
else
parent->_right = cur;
return true;
}
4.3 删除
bool Erase(const T& data)
{
PNode cur = _root;
PNode parent = cur;
while (cur)
{
if (cur->_data == data)
break;
parent = cur;
if (cur->_data > data)
cur = cur->_left;
else
cur = cur->_right;
}
if (cur == nullptr)
return false;
if (cur->_left == nullptr && cur->_right == nullptr)
{
if (cur != _root)
{
if (parent->_left == cur)
parent->_left = nullptr;
else
parent->_right = nullptr;
}
else
_root = nullptr;
delete cur;
cur = nullptr;
}
else if (cur->_right == nullptr)
{
if (cur != nullptr)
{
if (parent->_left == cur)
parent->_left = cur->_left;
else
parent->_right = cur->_left;
}
else
_root = nullptr;
delete cur;
cur = nullptr;
}
else if (cur->_left == nullptr)
{
if (cur != nullptr)
{
if (parent->_left == cur)
parent->_left = cur->_right;
else
parent->_right = cur->_right;
}
else
_root = nullptr;
delete cur;
cur = nullptr;
}
else
{
PNode MaxNode = cur->_left;
parent = cur;
while (MaxNode->_right)
{
parent = MaxNode;
MaxNode = MaxNode->_right;
}
cur->_data = MaxNode->_data;
if (parent->_left == MaxNode)
parent->_left = MaxNode->_left;
else
parent->_right = MaxNode->_left;
delete MaxNode;
MaxNode = nullptr;
}
return true;
}