c++實現二叉排序樹-插入-刪除-遞歸遍歷

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章