#include <iostream>
#include <vector>
using namespace std;
typedef struct Elem
{
int data;
struct Elem *left;
struct Elem *right;
}Elem, *pElem;
bool searchBitree( pElem root, int value, pElem *pInsert )
{
bool ret = true;
pElem pre = NULL;
if( NULL == root )
{
//*pInsert = pre;
return ret;
}
else
{
if( value > root->data )
{
*pInsert = root;
root = root->right;
ret = searchBitree( root, value, pInsert );
}
else if( value < root->data )
{
*pInsert = root;
root = root->left;
ret = searchBitree( root, value, pInsert );
}
else
{
*pInsert = root;
ret = false;
}
}
return ret;
}
int insertToBitree( pElem* root, int value )
{
int ret = 0;
pElem p = NULL;
pElem pnew = NULL;
if( NULL == root )
{
ret = -1;
cout << "inserToBitree func: err -1, parameter root==NULL " << endl;
return ret;
}
if( NULL == *root )
{
p = new Elem;
p->data = value;
p->left = NULL;
p->right = NULL;
*root = p;
return ret;
}
if( searchBitree( *root, value, &p ) )
{
pnew = new Elem;
pnew->data = value;
pnew->left = pnew->right = NULL;
if( value > p->data )
{
p->right = pnew;
}
else if( value < p->data )
{
p->left = pnew;
}
}
else
{
cout << "insertToBitree func: err -1, insert the same value: " << value << endl;
ret = -1;
return ret;
}
return ret;
}
int deleteElem( pElem *p )
{
int ret = 0;
pElem pdata = *p;
pElem tmp = NULL;
pElem pswap = NULL;
pElem p1 = NULL;
pElem pre = NULL;
if( NULL == pdata->right )
{
tmp = pdata;
*p = pdata->left;
delete tmp;
}
else
{
if( NULL == pdata->left )
{
tmp = pdata;
*p = pdata->right;
delete tmp;
}
else
{
//pswap = pdata->left; // not null
//p1 = pswap;
pre = pdata;
pswap = pdata->left; // not null
while( pswap->right )
{
pre = pswap;
pswap = pswap->right;
}
pdata->data = pswap->data;
if( pre == pdata )
{
pre->left = pswap->left;
}
else
{
pre->right = pswap->left;
}
delete pswap;
pswap = NULL;
}
}
return ret;
}
int deleteBitree( pElem* p, int value )
{
int ret = 0;
if( NULL == *p )
{
return ret;
}
else
{
if( (*p)->data == value )
{
return deleteElem(p);
}
else if( value < (*p)->data )
{
return deleteBitree( &(*p)->left, value );
}
else
{
return deleteBitree( &(*p)->right, value );
}
}
return ret;
}
void preOrder( pElem root )
{
if( root != NULL )
{
cout << root->data << " ";
preOrder( root->left );
preOrder( root->right );
}
return;
}
void midOrder( pElem root )
{
if( root != NULL )
{
midOrder( root->left );
cout << root->data << " ";
midOrder( root->right );
}
return;
}
void postOrder( pElem root )
{
if( root != NULL )
{
postOrder( root->left );
postOrder( root->right );
cout << root->data << " ";
}
return;
}
int main()
{
int ret = 0;
pElem root = NULL;
int n = 0;
cin >> n;
int *pdata = new int[n];
int data = 0;
for( int i = 0; i < n; i++ )
{
cin >> data;
insertToBitree( &root, data );
}
preOrder(root);
cout << endl;
midOrder(root);
cout << endl;
postOrder(root);
deleteBitree( &root, 2 );
cout << endl;
preOrder(root);
return ret;
}
c++實現二叉排序樹-插入-刪除-遞歸遍歷
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.