目录
1.搜索二叉树的删除
2.递归销毁搜索二叉树
3.递归复制二叉搜索树,搜索二叉树的深拷贝,析构函数
4.赋值
5.递归版本的查找
*6.递归版本的插入
7.递归版本的删除
代码总览
1.搜索二叉树的删除
要删除的节点只有左/右孩子节点的情况,无孩子节点的情况
要删除的节点左右孩子节点都不为空的情况(即完成else中的内容),找左子树的最大节点或者右子树的最小节点代替
2.递归销毁搜索二叉树
void DestoryTree(Node* root)
{
if (root == nullptr)
return;
DestoryTree(root->_left);
DestoryTree(root->_right);
delete root;
}
3.递归复制二叉搜索树,搜索二叉树的深拷贝,析构函数
放在私有区域,使用前序遍历
Node* CopyTree(Node* root)
{
if (root == nullptr)
return nullptr;
Node* copyNode = new Node(root->_key);
copyNode->_left = CopyTree(root->_left);
copyNode->_right = CopyTree(root->_right);
return copyNode;
}
递归的方式
放在公有区域
// 强制编译器自己生成构造 // C++11支持 BSTree() = default; BSTree(const BSTree& t) { _root = CopyTree(t._root); } ~BSTree() { DestoryTree(_root); _root = nullptr; }
4.赋值
// t1 = t2
BSTree& operator=(BSTree t)
{
swap(_root, t._root);
return *this;
}
5.递归版本的查找
bool FindR(const K& key)
{
return _FindR(_root, key);
}
bool _FindR(Node* root, const K& key)
{
if (root == nullptr)
return false;
if (root->_key < key)
{
return _FindR(root->_right, key);
}
else if (root->_key > key)
{
return _FindR(root->_left, key);
}
else
{
return true;
}
}
bool FindR(const K& key)
{
return _FindR(_root, key);
}
bool _FindR(Node* root, const K& key)
{
if (root == nullptr)
return false;
if (root->_key < key)
{
return _FindR(root->_right, key);
}
else if (root->_key > key)
{
return _FindR(root->_left, key);
}
else
{
return true;
}
}
*6.递归版本的插入
bool InsertR(const K& key)
{
return _InsertR(_root, key);
}
注意此处使用引用
bool _InsertR(Node*& root, const K& key)
{
if (root == nullptr)
{
root = new Node(key);
return true;
}
if (root->_key < key)
return _InsertR(root->_right, key);
else if (root->_key > key)
return _InsertR(root->_left, key);
else
return false;
}
7.递归版本的删除
bool EraseR(const K& key)
{
return _EraseR(_root, key);
}
bool _EraseR(Node*& root, const K& key)
{
if (root == nullptr)
return false;
if (root->_key < key)
{
return _EraseR(root->_right, key);
}
else if (root->_key > key)
{
return _EraseR(root->_left, key);
}
else
{
Node* del = root;
// 删除
if (root->_left == nullptr)
{
root = root->_right;
}
else if (root->_right == nullptr)
{
root = root->_left;
}
else
{
Node* minRight = root->_right;
while (minRight->_left)
{
minRight = minRight->_left;
}
swap(root->_key, minRight->_key);
return _EraseR(root->_right, key);
}
delete del;
return true;
}
}
要删除的节点只有左/右孩子节点的情况
要删除的节点左右孩子节点不为空的情况



