开始个人树的学习: 二叉搜索树->平衡树AVL->红黑树
参考的博客地址://http://blog.chinaunix.net/uid-27033491-id-3301179.html
个人代码如下:
//http://blog.chinaunix.net/uid-27033491-id-3301179.html
#include <iostream>
using namespace std;
//二叉搜索树和二叉排序树
class BTree
{
public:
typedef struct Node
{
Node(){}
Node(int d, Node* l, Node* r):data(d),left(l),right(r){}
int data;
struct Node* left;
struct Node* right;
}Node;
public:
BTree():Root(NULL) {}
Node* Search(int elem);
Node** ppSearch(int elem);
void Insert(int elem);
void Delete(int elem);
void Print(Node *Root);
~BTree();
//private:
Node* Root;
void FreeDynaMemory(Node* root);
};
void BTree:: Print(Node* Root)
{
if(NULL == Root) return;
cout<< Root->data << " ";
Print(Root->left);
Print(Root->right);
}
BTree::Node* BTree::Search(int elem)
{
Node* Loop = Root;
while(Loop)
{
if(elem == Loop->data) return Loop;
else if(elem > Loop->data)
{
Loop = Loop->right;
continue;
}
else
{
Loop = Loop->left;
continue;
}
}
return NULL;
}
void BTree::Insert(int elem)
{
Node** root = &Root;
while(*root)
{
if((*root)->data == elem)
return ;
else if((*root)->data < elem)
{
root = &((*root)->right);
continue;
}
else
{
root = &((*root)->left);
continue;
}
}
*root = new Node(elem, NULL, NULL);
}
BTree::Node** BTree::ppSearch(int elem)
{
Node** nodeLoop = &Root;
while(*nodeLoop)
{
if((*nodeLoop)->data == elem)
return nodeLoop;
else if((*nodeLoop)->data < elem)
nodeLoop = &((*nodeLoop)->right);
else
nodeLoop = &((*nodeLoop)->left);
}
return NULL;
}
void BTree::Delete(int elem)
{
Node**ppNode = ppSearch(elem);
if(NULL == ppNode) return;
//它是叶子节点
if(NULL == (*ppNode)->left && NULL == (*ppNode)->right)
{
delete (*ppNode);
*ppNode = NULL;
}
else if(NULL != (*ppNode)->left && NULL == (*ppNode)->right)
{
//它只有左子树
Node *pTmp = *ppNode;
*ppNode = (*ppNode)->left;
delete pTmp;
}
else if(NULL == (*ppNode)->left && NULL != (*ppNode)->right)
{
//它只有右子树
Node *pTmp = *ppNode;
*ppNode = (*ppNode)->right;
delete pTmp;
}
else
{
//它有左右子树
Node *pRight = (*ppNode)->right;
Node *pTmp = *ppNode;
*ppNode = (*ppNode)->left;
delete pTmp;
Node** ppLoop = ppNode;
while(*ppLoop)
ppLoop = &((*ppLoop)->right);
*ppLoop = pRight;
}
}
void BTree::FreeDynaMemory(Node* root)
{
if(NULL == root) return;
FreeDynaMemory(root->left);
FreeDynaMemory(root->right);
delete root;
}
BTree::~BTree()
{
if(NULL == Root) return;
FreeDynaMemory(Root);
}
int main()
{
int a[] = {345, 123, 456, 12, 3, 14};
int len = sizeof(a)/sizeof(int);
BTree bt;
for(int i = 0; i < len; ++i)
bt.Insert(a[i]);
bt.Delete(345);
BTree::Node* tmp = bt.Search(12);
if(NULL != tmp)
cout<< tmp->data <<endl;
bt.Print(bt.Root);
return 0;
}
输出: