二叉查找树的实现
二叉查找树性质
- 任意节点其左子树上任意值比节点值 小 右子树上任意值比节点值 大
- 插入 大于当前节点向右子树 小于向左
- 删除 当删除节点 具有左右子树 找到左子树最大值(最右边)与其交换删除 / 找到右子树最小值(最左边) 交换删除 满足查找树性质
- 删除 当删除节点 **只有一边有子树时 将第一个子节点与其交换 **
template<class T>
struct TreeNode {
T val;
TreeNode<T> *left;
TreeNode<T> *right;
TreeNode(T x) : val(x), left(nullptr), right(nullptr) {};
};
template<class T>
class FindTree
{
TreeNode<T>* root;
public:
FindTree() { root = nullptr; };
~FindTree() {};
public:
void Insert(T value);
void Delete(TreeNode<T>* node);
TreeNode<T>* Find(TreeNode<T>* node);
private:
};
template<class T>
void FindTree<T>::Insert(T value)
{
TreeNode<T>* push = new TreeNode<T>(value);
if (root == nullptr)
root = new TreeNode<T>(value);
else
{
TreeNode<T>* temp = root;
while (temp!=nullptr)
{
if (push->val == temp->val)
{
return;
}
if (push->val > temp->val)
{
if (temp->right == nullptr)
{
temp->right = push;
break;
}
else
temp = temp->right;
}
else if (push->val < temp->val)
{
if (temp->left == nullptr)
{
temp->left = push;
break;
}
else
temp = temp->left;
}
}
}
}
template<class T>
void FindTree<T>::Delete(TreeNode<T> * node)
{
if (node == nullptr||root==nullptr)
return;
TreeNode<T>* parent = nullptr, *reNode = root;
while (reNode != nullptr)
{
if (node->val == reNode->val)
break;
else if (node->val > reNode->val)
{
parent = reNode;
reNode = reNode->right;
}
else
{
parent = reNode;
reNode = reNode->left;
}
}
if (reNode != nullptr)
{
if (reNode->left != nullptr && reNode->right != nullptr)
{
TreeNode<T>* node1 = reNode, *node2 = reNode->left;
while (node2->right != nullptr)
{
node1 = node2;
node2 = node2->right;
}
reNode->val = node2->val;
if (parent->left == reNode)
parent->left = node2;
else if (parent->right == reNode)
parent->right = node2;
delete node2;
node2 = nullptr;
}
else if (reNode->left == nullptr)
{
if (reNode == root)
{
root = root->right;
return;
}
if (parent->left == reNode)
parent->left = reNode->right;
else
parent->right = reNode->right;
delete reNode;
reNode == nullptr;
}
else if(reNode->right==nullptr)
{
if (reNode == root)
{
root = root->left;
return;
}
if (parent->left == reNode)
parent->left = reNode->left;
else
parent->right = reNode->left;
delete reNode;
reNode = nullptr;
}
}
}
template<class T>
TreeNode<T>* FindTree<T>::Find(TreeNode<T> * node)
{
if (node == nullptr||root==nullptr)
return nullptr;
TreeNode<T>* temp=root;
while (temp!=nullptr)
{
if (temp->val == node->val)
return temp;
else if(node->val > temp->val)
{
temp = temp->right;
}
else
{
temp = temp->left;
}
}
return nullptr;
}