1 Star 0 Fork 0

非启鹏程/c++

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
二叉搜索树.cpp 3.24 KB
一键复制 编辑 原始数据 按行查看 历史
非启鹏程 提交于 2022-10-02 01:21 . update 树/二叉搜索树.cpp.
#pragma once
template<class T>
struct BSTNode
{
BSTNode<T>* _left;
BSTNode<T>* _right;
T _value;
BSTNode(const T& value = T())
: _left(nullptr)
, _right(nullptr)
, _value(value)
{}
};
// value唯一
template<class T>
class BSTree
{
typedef BSTNode<T> Node;
public:
BSTree()
: _root(nullptr)
{}
~BSTree()
{
DestroyBST(_root);
}
Node* Insert(const T& value)
{
// 1. 空树,直接插入并返回
if (nullptr == _root)
{
_root = new Node(value);
return _root;
}
// 2. 非空:
// a. 找带入元素在BST中的位置,并保存其双亲
Node* cur = _root;
Node* parent = nullptr;
while (cur)
{
parent = cur;
if (value < cur->_value)
cur = cur->_left;
else if (value > cur->_value)
cur = cur->_right;
else
return cur;
}
// b. 插入新节点
cur = new Node(value);
if (value < parent->_value)
parent->_left = cur;
else
parent->_right = cur;
return cur;
}
bool Erase(const T& value)
{
if (nullptr == _root)
return false;
// 1. 找待删除节点在BST中的位置,并保存其双亲
Node* delNode = _root;
Node* parent = nullptr;
while (delNode)
{
if (delNode->_value == value)
break;
else if (value < delNode->_value)
{
parent = delNode;
delNode = delNode->_left;
}
else
{
parent = delNode;
delNode = delNode->_right;
}
}
// value不存在
if (nullptr == delNode)
return false;
// 2. 删除delNode
if (nullptr == delNode->_right)
{
// 叶子节点 || 只有左孩子
if (nullptr == parent)
{
// delNode就是根节点
_root = delNode->_left;
}
else
{
if (delNode == parent->_left)
parent->_left = delNode->_left;
else
parent->_right = delNode->_left;
}
}
else if (nullptr == delNode->_left)
{
// 只有右孩子
if (nullptr == parent)
{
// delNode是根节点
_root = delNode->_right;
}
else
{
// delNode只有右孩子
if (parent->_left == delNode)
parent->_left = delNode->_right;
else
parent->_right = delNode->_right;
}
}
else
{
// 左右孩子都存在
// 1. 找替代节点---并记录其双亲
parent = delNode;
Node* firstInOrder = delNode->_right;
while (firstInOrder->_left)
{
parent = firstInOrder;
firstInOrder = firstInOrder->_left;
}
// 2. 将替代节点中的值域赋值给待删除节点
delNode->_value = firstInOrder->_value;
// 3. 删除替代节点
if (firstInOrder == parent->_left)
parent->_left = firstInOrder->_right;
else
parent->_right = firstInOrder->_right;
delNode = firstInOrder;
}
delete delNode;
return true;
}
Node* Find(const T& value)
{
Node* cur = _root;
while (cur)
{
if (value == cur->_value)
return cur;
else if (value < cur->_value)
cur = cur->_left;
else
cur = cur->_right;
}
return nullptr;
}
void InOrder()
{
InOrder(_root);
cout << endl;
}
private:
void DestroyBST(Node*& root)
{
if (root)
{
DestroyBST(root->_left);
DestroyBST(root->_right);
delete root;
root = nullptr;
}
}
void InOrder(Node* root)
{
if (root)
{
InOrder(root->_left);
cout << root->_value << " ";
InOrder(root->_right);
}
}
private:
Node* _root;
};
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/dunqipeng/c1.git
git@gitee.com:dunqipeng/c1.git
dunqipeng
c1
c++
master

搜索帮助