この記事では、バイナリサーチツリーのC ++実装について説明します。一部の教科書では、バイナリサーチツリーはバイナリソートツリーとも呼ばれています。このツリー構造には、BBST、AVLTree、RBTreeなど、多くのバリアントがあります。中間の順序でトラバースされる結果シーケンスがキーコード値の昇順で配置されるようにデータは合理的にレイアウトされます。これにより、要素のアクセス効率は可能な限り対数時間の複雑さに近くなりますが、この記事で説明する単純なBST用語では、どのノードにも左と右のサブツリーバランシングプロセスがないため、極端な場合には、BSTは「リストリスト」タイプの「スキューツリー」に退化するため、純粋に効率の観点からは最適化されません。 BSTが挿入またはアクセスされているかどうかにかかわらず、削除やその他の操作では満足のいく結果を得ることができません。この問題を解決するために、人々はAVL、RBTree、およびその他のデータ構造を提案し、さまざまな戦略を使用して前面を作成しました上記の操作は、可能な限り時間をかけて最適化されます。
#include"BinTree.h"
using namespace std;
template <typename T>
class BST : public BinTree<T>
{
protected:
BinNodePosi(T) _hot;
public:
virtual BinNodePosi(T)& search(const T& e);
virtual BinNodePosi(T) insert(const T& e);
virtual bool remove(const T& e);
};
template <typename T>
BinNodePosi(T)& BST<T>::search(const T& e)
{
if (!BinTree<T>::_root || e == BinTree<T>::_root->data)
{
_hot = NULL;
return BinTree<T>::_root;
}
for (_hot = BinTree<T>::_root; ; )
{
BinNodePosi(T)& c = (e < _hot->data) ? _hot->lc : _hot->rc;
if (!c || e == c->data)
{
return c;
}
_hot = c;
}
}
template <typename T>
bool BST<T>::remove(const T& e)
{
BinNodePosi(T)& x = search(e);
if (!x)
{
return false;
}
removeAt(x, _hot);
BinTree<T>::_size--;
BinTree<T>::updateHeightAbove(_hot);
return true;
}
template <typename T>
static BinNodePosi(T) removeAt(BinNodePosi(T)& x, BinNodePosi(T)& hot)
{
BinNodePosi(T) w = x;
BinNodePosi(T) succ = NULL;
if (!HasLChild(*x))
{
succ = x = x->rc;
}
else if (!HasRChild(*x))
{
succ = x = x->lc;
}
else
{
w = w->succ();
swap(x->data, w->data);
BinNodePosi(T) u = w->parent;
((u == x) ? u->rc : u->lc) = succ = w->rc;
}
hot = w->parent;
if (succ)
{
succ->parent = hot;
}
release(w->data);
release(w);
return succ;
}
template <typename T>
BinNodePosi(T) BST<T>::insert(const T& e)
{
BinNodePosi(T)& x = search(e);
if (x)
{
return x;
}
x = new BinNode<T>(e, _hot);
BinTree<T>::_size++;
BinTree<T>::updateHeightAbove(x);
return x;
}
int main()
{
BST<int>obj;
obj.insert(1);
obj.insert(10);
obj.insert(5);
obj.travIn(visit<int>);
cout << endl;
if (!obj.search(5))
{
cout << "element 5 not found!" << endl;
}
obj.remove(1);
if (obj.empty())
{
cout << "Tree is empty"<<endl;
}
getchar();
return 0;
}