#include "stdafx.h"
#include<iostream>
using namespace std;
class Node
{
public:
int data;
Node *parent;
Node *left;
Node *right;
public:
Node():data(-1), parent(NULL), left(NULL), right(NULL){};
Node(int num):data(num), parent(NULL), left(NULL), right(NULL){};
};
class BinarySortTree
{
public:
BinarySortTree(int num[], int len)
{
root = new Node(num[0]);
for(int i = 0; i < len; i++)
{
insertNode(num[i]);
}
}
void insertNode(int data)
{
if(root != NULL)
{
insertNode(root, data);
}
}
Node *searchNode(int data)
{
if(root != NULL)
{
return searchNode(root, data);
}
return NULL;
}
void deleteNode(int data)
{
Node *current = NULL;
current = searchNode(data);
if(current != NULL)
{
deleteNode(current);
}
}
void inOrderTraversal()
{
if(root == NULL)
{
return;
}
else
{
inOrderTraversal(root);
}
}
void preOrderTraversal()
{
if(root == NULL)
{
return;
}
else
{
preOrderTraversal(root);
}
}
void postOrderTraversal()
{
if(root == NULL)
{
return;
}
else
{
postOrderTraversal(root);
}
}
private:
void insertNode(Node *current, int data)
{
if( data < current->data)
{
if(current->left == NULL)
{
current->left = new Node(data);
current->left->parent = current;
}
else
{
insertNode(current->left, data);
}
}
else if( data > current->data)
{
if(current->right == NULL)
{
current->right = new Node(data);
current->right->parent = current;
}
else
{
insertNode(current->right, data);
}
}
return;
}
Node *searchNode(Node *current, int data)
{
if(data < current->data)
{
if(current->left == NULL)
{
return NULL;
}
return searchNode( current->left, data);
}
else if( data > current->data)
{
if(current->right == NULL)
{
return NULL;
}
return searchNode(current->right, data);
}
return current;
}
void deleteNode(Node *current)
{
if(current->left != NULL)
{
deleteNode(current->left);
}
if(current->right != NULL)
{
deleteNode(current->right);
}
if(current->parent == NULL)
{
delete current;
root = NULL;
return;
}
if(current->parent->data > current->data)
{
current->parent->left = NULL;
}
else
{
current->parent->right = NULL;
}
delete current;
}
void inOrderTraversal(Node *current)
{
if(current != NULL)
{
inOrderTraversal(current->left);
cout<<current->data<<" ";
inOrderTraversal(current->right);
}
}
void preOrderTraversal(Node *current)
{
if(current != NULL)
{
cout<<current->data<<" ";
preOrderTraversal(current->left);
preOrderTraversal(current->right);
}
}
void postOrderTraversal(Node *current)
{
if(current != NULL)
{
postOrderTraversal(current->left);
postOrderTraversal(current->right);
cout<<current->data<<" ";
}
}
private:
Node *root;
};
int _tmain(int argc, _TCHAR* argv[])
{
int num[] = {5, 3, 11, 7, 2, 4, 6, 8, 1};
BinarySortTree tree(num, 9);
cout<<"InOrder"<<endl;
tree.inOrderTraversal();
cout<<endl<<"preOrder"<<endl;
tree.preOrderTraversal();
cout<<endl<<"postOrder"<<endl;
tree.postOrderTraversal();
cout<<endl<<"Please input the number you want to search: ";
int n = -1;
cin>>n;
getchar( );
Node *newNode = tree.searchNode(n);
if(newNode == NULL)
{
cout<<"the number you want to search is NULL!"<<endl;
}
if(newNode->left != NULL)
cout<<"The left child is: "<<newNode->left->data<<" ";
else
cout<<"The left child is: NULL ";
if(newNode->right != NULL)
cout<<"The right child is: "<<newNode->right->data<<endl;
else
cout<<"The right child is: NULL ";
getchar( );
return 0;
}