搜索二叉树含迭代器
vs2013下编写的项目工程见
我的
github: ​​​https://github.com/excelentone/DataStruct​

#include<iostream>
#include<cassert>
using namespace std;
template<class K, class V>
struct BSTNode
{
BSTNode(const K& key=0, const V& value=0)
: _pLeft(NULL)
, _pRight(NULL)
, _pParent(NULL)
, _key(key)
, _value(value)
{}
BSTNode<K, V>* _pParent;
BSTNode<K, V>* _pLeft;
BSTNode<K, V>* _pRight;

K _key;
V _value;
};

//
template<typename K, typename V>
class BinaryIterator
{
private:
typedef BSTNode<K, V> Node;
typedef BinaryIterator<K, V/*, K&, V&*/> Iterator;
public:
BinaryIterator(Node *pNode = nullptr) :_pNode(pNode)
{}
Iterator &operator++()
{
_Increase(_pNode);
return *this;
}
Iterator &operator--()
{
_Decrease(_pNode);
return *this;
}
Iterator operator++(int)
{
Iterator temp(*this);
++(*this);
return temp;
}
Iterator operator--(int)
{
Iterator temp(*this);
--(*this);
return temp;
}
bool operator==(Iterator &it)
{
return _pNode == it._pNode;
}
bool operator!=(Iterator &it)
{
return !(*this == it);
}
private:
Node *FindMax(Node *pCur)
{
assert(pCur);
while (pCur->_pRight)
pCur = pCur->_pRight;
return pCur;
}
Node *FindMin(Node *pCur)
{
assert(pCur);
while (pCur->_pLeft)
pCur = pCur->_pLeft;
return pCur;
}
void _Increase(Node *pNode)
{
if (pNode->_pRight)
{
pNode = FindMin(pNode->_pRight);
}
else
{
Node *pParent = pNode->_pParent;
while (pParent->_pRight == pNode)
{
pNode = pParent;
pParent = pNode->_pParent;
}
if (pParent->_pRight != pNode)
pNode = pParent;
}
_pNode = pNode;
}
void _Decrease(Node *pNode)
{
if (pNode->_pLeft)
{
pNode = FindMax(pNode->_pLeft);
}
else
{
Node *pParent = pNode->_pParent;
while (pParent->_pLeft == pNode)
{
pNode = pParent;
pParent = pNode->_pParent;
}
pNode = pParent;
}
_pNode = pNode;
}
public:
Node *_pNode;
};
template<class K, class V>
class BinarySearchTree
{
typedef BSTNode<K, V> Node;
typedef BinarySearchTree<K, V> Self;
public:

BinarySearchTree()
: _pRoot(NULL), _pHead(new Node())
{}

BinarySearchTree(const Self& bst)
{
_pRoot=_Init(bst._pRoot);
}
Self& operator=(const Self& bst)
{
if (this != &bst)
{
if (_pRoot)
{
_DestroyTree(_pRoot);
}
_pRoot=_Init(bst._pRoot);
}
return *this;
}
~BinarySearchTree()
{
_DestroyTree(_pRoot);
}

// 查找递归和非递归
Node * Find_Nor(const K& key)
{
return _Find_Nor(_pRoot,key);
}
Node * Find(const K& key)
{
return _Find(_pRoot, key);
}

// 插入递归和非递归
bool Insert_Nor(const K& key, const V& value)
{
if (NULL == _pRoot)
{
_pRoot = new Node(key, value);
return true;
}
return _Insert_Nor(_pRoot, key,value);
}
bool Insert(const K& key, const V& value)
{

bool flag=_Insert(_pRoot,NULL,key, value);
_pHead->_pParent = _pRoot;
_pRoot->_pParent = _pHead;
_pHead->_pLeft = FindMin(_pRoot);
_pHead->_pRight = FindMax(_pRoot);
return flag;
}

// 删除递归和非递归
bool Remove_Nor(const K& key)
{
return _Remove_Nor(_pRoot,key/*,false*/);
}
bool Remove(const K& key)
{
bool flag= _Remove(_pRoot, key);
_pHead->_pParent = _pRoot;
_pRoot->_pParent = _pHead;
_pHead->_pLeft = FindMin(_pRoot);
_pHead->_pRight = FindMax(_pRoot);
return flag;
}

void InOrder()
{
cout << "InOrder:";
_InOrder(_pRoot);
cout << endl;
}
Node * ToList()
{
Node *pre = NULL;
_ToList(_pRoot, pre);
return FindMin(_pRoot);
}
BinaryIterator<K, V> end()
{
return BinaryIterator<K, V> (_pHead);
}
BinaryIterator<K, V> begin()
{
return BinaryIterator<K, V>(FindMin(_pRoot));
}
private:
Node * _Find_Nor(Node *pRoot, const K &key)
{
Node *pCur = pRoot;
while (pCur)
{
if (key < pCur->_key)
{
pCur = pCur->_pLeft;
}
else if (key>pCur->_key)
{
pCur = pCur->_pRight;
}
else
{
return pRoot;
}
}
return NULL;
}
Node *FindMin(Node *pCur)
{
assert(pCur);
while (pCur->_pLeft)
pCur = pCur->_pLeft;
return pCur;
}
Node *FindMax(Node *pCur)
{
assert(pCur);
while (pCur->_pRight)
pCur = pCur->_pRight;
return pCur;
}
Node* _Find(Node* pRoot, const K& key)
{
if (NULL == pRoot)
{
return false;
}
if (key < pRoot->_key)
{
_Find(pRoot->_pLeft, key);
}
else if (key>pRoot->_key)
{
_Find(pRoot->_pRight, key);
}
else
{
return pRoot;
}
}
bool _Insert_Nor(Node* pRoot, const K &key, const V &value)
{
while (pRoot)
{
if (key < pRoot->_key)
{
if (NULL == pRoot->_pLeft)
{
pRoot->_pLeft = new Node(key, value);
return true;
}
else
pRoot = pRoot->_pLeft;
}
else if (key>pRoot->_key)
{
if (NULL == pRoot->_pRight)
{
pRoot->_pRight = new Node(key, value);
return true;
}
else
pRoot = pRoot->_pRight;
}
else
{
return false;
}
}
return true;
}
bool _Insert(Node* &pRoot, Node *pParent,const K& key, const V& value)
{
if (NULL == pRoot)
{
pRoot = new Node(key, value);

pRoot->_pParent = pParent;
return true;
}
if (key < pRoot->_key)
{
pParent = pRoot;
_Insert(pRoot->_pLeft,pParent, key, value);

}
else if (key>pRoot->_key)
{
pParent = pRoot;
_Insert(pRoot->_pRight, pParent, key, value);
}
else
{
return false;
}
return true;
}

bool _Remove(Node*& pRoot, const K& key)
{
if (NULL == pRoot)
{
return false;
}
if (pRoot->_key > key)
{
_Remove(pRoot->_pLeft, key);
}
else if (pRoot->_key < key)
{
_Remove(pRoot->_pRight, key);
}
else
{
if (NULL != pRoot->_pLeft&&NULL != pRoot->_pRight)
{
Node *pDel = pRoot;
pRoot->_key = FindMin(pRoot->_pRight)->_key;
_Remove(pRoot->_pRight, pRoot->_key);
}
else
{
Node *pDel = pRoot;
if (pRoot->_pLeft != NULL)
{
pRoot = pRoot->_pLeft;
}
else
{
pRoot = pRoot->_pRight;
}
delete pDel;
}
}
return false;
}
bool _Remove_Nor(Node *&pRoot, const K &key/*,bool flag*/)
{
Node *pCur = pRoot;
Node *pParent = pCur;
/*if (flag == true)
{
pCur = pCur->_pRight;
}*/
while (pCur)
{
if (key < pCur->_key)
{
pParent = pCur;
pCur = pCur->_pLeft;
}
else if (key>pCur->_key)
{
pParent = pCur;
pCur = pCur->_pRight;
}
else
{
if (pCur->_pLeft&&NULL==pCur->_pRight)
{
if (pCur = pParent->_pLeft)
{
Node *pTemp = pCur;
pParent->_pLeft = pCur->_pLeft;
delete pTemp;
}
else if (pCur = pParent->_pRight)
{
Node *pTemp = pCur;
pParent->_pRight = pCur->_pLeft;
delete pTemp;
}
return true;
}
else if (pCur->_pLeft&&pCur->_pRight)
{
Node *pTempPre = pCur;
Node *pTemp = FindMin(pCur->_pRight);
pCur->_key = pTemp->_key;
_Remove_Nor(pCur->_pRight, pCur->_key);
return true;
}
else
{
if (pCur ==pParent->_pLeft)
{
Node *pTemp = pCur;
pParent->_pLeft = pCur->_pRight;
delete pTemp;
}
else if (pCur == pParent->_pRight)
{
Node *pTemp = pCur;
pParent->_pRight = pCur->_pRight;
delete pTemp;

}
return true;
}

}
}
return false;
}
void _InOrder(Node* pRoot)
{
if (pRoot)
{
_InOrder(pRoot->_pLeft);
cout << pRoot->_key << " ";
_InOrder(pRoot->_pRight);
}
}
Node *_Init(Node *pRoot)
{
if (NULL != pRoot)
{
Node *pNewRoot = new Node(pRoot->_key, pRoot->_value);
pNewRoot->_pLeft = _Init(pRoot->_pLeft);
pNewRoot->_pRight = _Init(pRoot->_pRight);
return pNewRoot;
}
return NULL;
}
void _DestroyTree(Node *pRoot)
{
if (pRoot)
{
_DestroyTree(pRoot->_pLeft);
_DestroyTree(pRoot->_pRight);
delete(pRoot);
pRoot = NULL;
}
}
void _ToList(Node *pRoot, Node *&pre)
{
if (NULL==pRoot)
return;
Node *cur = pRoot;
_ToList(pRoot->_pLeft,pre);
if (pre)
{
pre->_pRight = cur;
}
cur->_pLeft = pre;
pre = cur;
_ToList(pRoot->_pRight,pre);
}
public:
Node* _pRoot;
Node *_pHead;
};

// 测试非递归的三种情况
void Test1()
{
BinarySearchTree<int, int> bst;

int a[] = { 5, 3,4,1, 7, 8, 2, 6, 0, 9 };
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
bst.Insert(a[i],a[i]);
}
BinarySearchTree<int, int> bstcpy;
bstcpy = bst;
BSTNode<int, int> *list=bst.ToList();
bstcpy.InOrder();
bst.InOrder();
bst.Remove_Nor(6);
bst.InOrder();
cout << bst.Find(10) << endl;
cout << bst.Find_Nor(5) << endl;

}

// 测试递归的三种情况
void Test2()
{
BinarySearchTree<int, int> bst;
int a[] = { 5, 3,4, 1, 7, 8, 2, /*6,*/ 0, 9 };
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
bst.Insert(a[i], a[i]);
}
//BinaryIterator<int, int> it(bst._pRoot);
it = ++bst.end();
//BSTNode<int, int> *start = bst.Find(3);
//for (it=start; it != bst.end(); it++)
//{
// cout << it._pNode->_key << " ";
//}
cout << endl;
bst.InOrder();
bst.Remove(5);
bst.InOrder();
cout << bst.Find(10) << endl;
cout << bst.Find_Nor(5) << endl;

}
int main()
{
Test1();
//Test2();
system("pause");
}