#include<iostream>
using namespace std;
class Tree{
struct TreeNode{
int value;
TreeNode* lnode;
TreeNode* rnode;
}* root;
bool _search(TreeNode* t,int value);
void _printTree(TreeNode* t);
void _destroy(TreeNode* t);
public:
Tree(){
root = NULL;
}
~Tree();
bool searchNode(int key);
void add(int value);
int deleteNode(int value);
void printTree();
};
#include "Tree.h"
void Tree::_destroy(TreeNode* t){
if(t==NULL)
return;
_destroy(t->lnode);
_destroy(t->rnode);
delete t;
}
Tree::~Tree(){
_destroy(root);
cout<<"destruct tree"<<endl;
}
bool Tree::_search(TreeNode* t,int value){
if(t==NULL){
return false;
}
if(t->value = value)
return true;
if(t->value>value){
_search(t->lnode,value);
}else{
_search(t->rnode,value);
}
}
bool Tree::searchNode(int value){
return _search(root,value);
}
void Tree::add(int value){
TreeNode *r=root;
if(root==NULL){
root=new TreeNode;
root->value = value;
root->lnode = NULL;
root->rnode =NULL;
return ;
}
TreeNode* parent=root;
while(r!=NULL){
parent = r;
if(r->value>value){
r = r->lnode;
}else if(r->value==value){
return ;
}else{
r=r->rnode;
}
}
TreeNode *node = new TreeNode;
node->value = value;
node->lnode = NULL;
node->rnode = NULL;
if(parent->value<value){
parent->rnode=node;
}else{
parent->lnode = node;
}
return ;
}
int Tree::deleteNode(int value){
if(root==NULL)
return 0;
TreeNode* p = root;
TreeNode* pre=root;
while((p!=NULL)&&(p->value!=value))
{
pre = p;
if(p->value<value)
p = p->rnode;
else
p = p->lnode;
}
if(p==NULL)
return 0;
if((p->lnode==NULL)||(p->rnode==NULL))
{
if(pre->lnode == p)
{
pre->lnode=(p->lnode==NULL)?(p->rnode):(p->lnode);
}else
pre->rnode=(p->lnode==NULL)?(p->rnode):(p->rnode);
free(p);
}else{
TreeNode *mid = p->rnode;
while(mid->lnode!=NULL){
pre=mid;
mid = mid->lnode;
}
p->value = mid->value;
if(pre->lnode == mid)
{
pre->lnode=(mid->lnode==NULL)?(mid->rnode):(mid->lnode);
}else
pre->rnode=(mid->lnode==NULL)?(mid->rnode):(mid->rnode);
free(mid);
}
return 1;
}
void Tree::_printTree(TreeNode *t){
if(t==NULL)
return;
_printTree(t->lnode);
cout<<t->value<<" ";
_printTree(t->rnode);
}
void Tree::printTree(){
_printTree(root);
cout<<endl;
}
#include<iostream>
#include"Tree.h"
int main(){
Tree t;
int a[10] = {5,4,2,8,7,1,9,3,6,10};
for(int i = 0 ;i<10;i++)
{
t.add(a[i]);
}
t.printTree();
t.deleteNode(5);
t.printTree();
}