You are on page 1of 5

// Example program

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

typedef struct Node


{
int data;
Node* left;
Node* right;
} node_t;

int LeftOf( const int value, const node_t* root )


{
return value < root->data;
}

int RightOf( const int value, const node_t* root )


{
return value > root->data;
}

node_t* Insert( node_t* root, const int value )


{
if ( root == NULL )
{
node_t* node = new node_t;
node->left = NULL;
node->right = NULL;
node->data = value;
return node;
}
if ( LeftOf( value, root ) )
root->left = Insert( root->left, value );

else if ( RightOf( value, root ) )

root->right = Insert( root->right, value );

return root;
}

bool Search( const node_t* root, int value )


{
if ( root == NULL )
return false;
if(root->data == value){
return true;
}
else if ( LeftOf( value, root ) ){
return Search( root->left, value );

}else if( RightOf( value, root ) ){


return Search( root->right, value );
}
}

int LeftMostValue( const node_t* root )


{
while ( root->left != NULL )
root = root->left;

return root->data;
}

node_t* Delete( node_t* root, int value )


{
if ( root == NULL )
return root;

if ( LeftOf( value, root ) )


root->left = Delete( root->left, value );

else if ( RightOf( value, root ) )


root->right = Delete( root->right, value );

else
{
// root->data == value, delete this node
if ( root->left == NULL )
{
node_t* newRoot = root->right;

// free( root );

delete root ;

return newRoot;
}
if ( root->right == NULL )
{
node_t* newRoot = root->left;

delete root ;

return newRoot;
}
root->data = LeftMostValue( root->right );
root->right = Delete( root->right, root->data );
}
return root;
}

void PreOrder(node_t* root){ // NLR


if(root != NULL)
{
std :: cout << root->data << " ";
PreOrder(root->left);
PreOrder(root->right);
}
}

void InOrder(node_t* root){ //LNR


if(root != NULL)
{
InOrder(root->left);
std :: cout << root->data << " ";
InOrder(root->right);
}
}

void PostOrder(node_t* root){ //LRN


if(root != NULL)
{
PostOrder(root->left);
PostOrder(root->right);
std :: cout << root->data << " ";
}
}

int main()
{
node_t* root = NULL;

root = Insert( root, 25 );


root = Insert( root, 15 );
root = Insert( root, 50 );
root = Insert( root, 10 );
root = Insert( root, 22 );
root = Insert( root, 35 );
root = Insert( root, 70 );
root = Insert( root, 4 );
root = Insert( root, 12 );
root = Insert( root, 18 );
root = Insert( root, 24 );
root = Insert( root, 31 );
root = Insert( root, 44 );
root = Insert( root, 66 );
root = Insert( root, 90 );

std :: cout << "\nDuyet preorder:";

PreOrder(root);

std :: cout << "\nDuyet inorder : ";

InOrder(root);

std :: cout << "\nDuyet postorder:";

PostOrder(root);

int value;

std:: cout << "\nnhap phan tu can tim : ";

std:: cin >> value;

if (Search( root, value ))

std :: cout << "\nco phan tu " << value << "\n";
else

std :: cout << "\n khong co phan tu " << value << "\n";

std::cout << "\n==Thu them phan tu 15 vao cay==\n";

Insert(root, 15);

std :: cout << "\nDuyet preorder:";

PreOrder(root);

std:: cout << "\nnhap phan tu can xoa : ";

std:: cin >> value;


std::cout <<"\n==xoa phan tu " << value << " khoi cay==\n";

Delete(root, value);

std :: cout << "\nDuyet preorder:";

PreOrder(root);

return 0;
}

You might also like