基本操作之头文件
#include <assert.h>
#include <malloc.h>
#include <stdio.h>
typedef int DataType;
typedef struct BSTreeNode
{
struct BSTreeNode* _pLeft;
struct BSTreeNode* _pRight;
DataType _data;
}Node, *PNode;
void InitBSTree(PNode* pRoot);
int InsertBST(PNode* pRoot, DataType data);
PNode FindBST(PNode pRoot, DataType data);
int DeleteBSTree(PNode* pRoot, int data);
void InOrder(PNode pRoot);
PNode BuyBSTreeNode(DataType data);
void DestroyBSTree(PNode* pRoot);
基本操作之函数实现
void InitBSTree(PNode* pRoot)
{
assert(pRoot);
* pRoot = NULL ;
}
#if 0
int InsertBST(PNode* pRoot, DataType data )
{
PNode pCur = NULL ;
PNode pParent = NULL ;
assert(pRoot);
if (NULL == * pRoot)
* pRoot = BuyBSTreeNode(data );
pCur = * pRoot;
while (pCur)
{
if (data < pCur-> _data)
{
pParent = pCur;
pCur = pCur-> _pLeft;
}
else if (data > pCur-> _data)
{
pParent = pCur;
pCur = pCur-> _pRight;
}
else
return 0 ;
}
pCur = BuyBSTreeNode(data );
if (data < pParent-> _data)
pParent-> _pLeft = pCur;
else
pParent-> _pRight = pCur;
return 1 ;
}
int DeleteBSTree(PNode* pRoot, int data )
{
PNode pCur = NULL ;
PNode pDel = NULL ;
PNode pParent = NULL ;
assert(pRoot);
if (NULL == * pRoot)
return 0 ;
pCur = * pRoot;
while (pCur)
{
if (data == pCur-> _data)
break;
else if (data < pCur-> _data)
{
pParent = pCur;
pCur = pCur-> _pLeft;
}
else
{
pParent = pCur;
pCur = pCur-> _pRight;
}
}
if (NULL == pCur)
return 0 ;
if (NULL == pCur-> _pRight)
{
pDel = pCur;
if (pCur == * pRoot)
* pRoot = pCur-> _pLeft;
else
{
if (pCur == pParent-> _pLeft)
pParent-> _pLeft = pCur-> _pLeft;
else
pParent-> _pRight = pCur-> _pLeft;
}
}
else if (NULL == pCur-> _pLeft)
{
pDel = pCur;
if (pCur == * pRoot)
* pRoot = pCur-> _pRight;
else
{
if (pParent-> _pLeft == pCur)
pParent-> _pLeft = pCur-> _pRight;
else
pParent-> _pRight = pCur-> _pRight;
}
}
else
{
pParent = pCur;
pDel = pCur-> _pRight;
while (pDel-> _pLeft)
{
pParent = pDel;
pDel = pDel-> _pLeft;
}
pCur-> _data = pDel-> _data;
if (pDel == pParent-> _pLeft)
pParent-> _pLeft = pDel-> _pRight;
else
pParent-> _pRight = pDel-> _pRight;
}
free(pDel);
return 1 ;
}
PNode FindBST(PNode pRoot, DataType data )
{
PNode pCur = pRoot;
while (pCur)
{
if (data == pCur-> _data)
return pCur;
else if (data < pCur-> _data)
pCur = pCur-> _pLeft;
else
pCur = pCur-> _pRight;
}
return NULL ;
}
#else
PNode FindBST(PNode pRoot, DataType data )
{
if (NULL == pRoot)
return NULL ;
if (pRoot-> _data == data )
return pRoot;
else if (data < pRoot-> _data)
return FindBST(pRoot-> _pLeft, data );
else
return FindBST(pRoot-> _pRight, data );
}
int InsertBST(PNode* pRoot, DataType data )
{
assert(pRoot);
if (NULL == * pRoot)
{
* pRoot = BuyBSTreeNode(data );
return 1 ;
}
else
{
if (data == (* pRoot)-> _data)
return 0 ;
else if (data < (* pRoot)-> _data)
return InsertBST(& (* pRoot)-> _pLeft, data );
else
return InsertBST(& (* pRoot)-> _pRight, data );
}
}
int DeleteBSTree(PNode* pRoot, int data )
{
assert(pRoot);
if (NULL == * pRoot)
return 0 ;
else
{
if (data < (* pRoot)-> _data)
return DeleteBSTree(& (* pRoot)-> _pLeft, data );
else if (data > (* pRoot)-> _data)
return DeleteBSTree(& (* pRoot)-> _pRight, data );
else
{
PNode pDel = * pRoot;
if (NULL == (* pRoot)-> _pRight)
{
* pRoot = pDel-> _pLeft;
free(pDel);
}
else if (NULL == (* pRoot)-> _pLeft)
{
* pRoot = pDel-> _pRight;
free(pDel);
}
else
{
pDel = (* pRoot)-> _pRight;
while (pDel-> _pLeft)
pDel = pDel-> _pLeft;
(* pRoot)-> _data = pDel-> _data;
return DeleteBSTree(& (* pRoot)-> _pRight, pDel-> _data);
}
}
}
}
#endif
void InOrder(PNode pRoot)
{
if (pRoot)
{
InOrder(pRoot-> _pLeft);
printf("%d " , pRoot-> _data);
InOrder(pRoot-> _pRight);
}
}
PNode BuyBSTreeNode(DataType data )
{
PNode pNewNode = (PNode)malloc(sizeof(Node));
assert(pNewNode);
pNewNode-> _pLeft = NULL ;
pNewNode-> _pRight = NULL ;
pNewNode-> _data = data ;
return pNewNode;
}
基本操作之测试代码
void TestBSTree()
{
int a [] = {5 ,3 ,4 ,1 ,7 ,8 ,2 ,6 ,0 ,9 };
PNode pRoot = NULL;
PNode pCur;
int i = 0 ;
InitBSTree(&pRoot);
for (; i < sizeof (a)/sizeof (a[0 ]); ++i)
InsertBST(&pRoot, a[i]);
InOrder(pRoot);
pCur = FindBST(pRoot, 8 );
if (pCur)
{
printf ("8 Is In BSTree!!!\n" );
}
else
printf ("8 Is Not In BSTree!!!\n" );
pCur = FindBST(pRoot, 10 );
if (pCur)
{
printf ("10 Is In BSTree!!!\n" );
}
else
printf ("10 Is Not In BSTree!!!\n" );
DeleteBSTree(&pRoot, 2 );
InOrder(pRoot);
printf ("\n" );
DeleteBSTree(&pRoot, 1 );
InOrder(pRoot);
printf ("\n" );
DeleteBSTree(&pRoot, 5 );
InOrder(pRoot);
printf ("\n" );
DeleteBSTree(&pRoot, 7 );
InOrder(pRoot);
printf ("\n" );
DestroyBSTree(pRoot);
}