#pragma once
#include<iostream>
using namespace std;
template<class T>
struct BTreeNode
{
BTreeNode(const T& data=T()):_data(data)
{}
BTreeNode<T>* left = nullptr;
BTreeNode<T>* right = nullptr;
T _data;
};
template<class T>
class BTree
{
typedef BTreeNode<T> Bnode;
typedef Bnode* pnode;
public:
BTree()
{
_root = nullptr;
}
~BTree()
{}
pnode Find(const T& data)
{
if (_root == nullptr)
return nullptr;
pnode pcur = _root;
while (pcur)
{
if (pcur->_data == data)
{
return pcur;
}
if (pcur->_data > data)
pcur = pcur->left;
if (pcur->_data < data)
pcur = pcur->right;
if (pcur->_data == data)
return pcur;
}
return nullptr;
}
bool Insert(const T& data)
{
if (_root == nullptr)
{
_root = new Bnode(data);
return true;
}
pnode pcur = _root;
pnode parent = nullptr;//记录双亲
while (pcur)
{
parent = pcur;
if (pcur->_data < data)
{
pcur = pcur->right;
}
else if (pcur->_data > data)
{
pcur = pcur->left;
}
else
{
return false;
}
}
pcur = new Bnode(data);
if (data < parent->_data)
{
parent->left = pcur;
}
if (data > parent->_data)
{
parent->right = pcur;
}
return true;
}
bool Erase(const T& data)
{
if (_root == nullptr)
return false;
pnode pcur = _root;
pnode parent = nullptr;
while (pcur)
{
if (pcur->_data > data)
{
parent = pcur;
pcur = pcur->left;
}
if (pcur->_data < data)
{
parent = pcur;
pcur = pcur->right;
}
if (pcur->_data == data)
break;
}
if (pcur == nullptr)
return false; //找不到该结点
if (nullptr == pcur->left)//没有左节点,直接删
{
if (parent->left == pcur)
{
parent->left = pcur->right;
}
if (parent->right == pcur)
{
parent->right = pcur->right;
}
delete pcur;
}
else if (nullptr == pcur->right)
{
if (parent->left == pcur)
{
parent->left = pcur->left;
}
if (parent->right == pcur)
{
parent->right = pcur->left;
}
delete pcur;
}
else
{
pnode Lpcur = pcur->left;
pnode Lparent = nullptr;
while (Lpcur)
{
Lparent = Lpcur;
Lpcur = Lpcur->right;
}
swap(pcur->_data, Lparent->_data);
delete Lparent;
Lparent = nullptr;
}
}
void Inorder(pnode root)
{
if (root == nullptr)
return;
Inorder(root->left);
cout << root->_data << " ";
Inorder(root->right);
}
void _Inorder()
{
Inorder(_root);
}
private:
pnode _root;
};