#include
#include
using namespace std;
//*************************
struct BSTree{
int value;
BSTree* bsLeft;
BSTree* bsRight;
};
//*************************
void printBSTree(BSTree* p);
BSTree* deleteNode(BSTree* p, int value);
int main()
{
int inputNum = 0;
//head pointer is fixed
//p pointer is scanning
BSTree* head = NULL;
BSTree* p = NULL;
//input -1 ends input
//scanf("%d",&inputNum);
cin>>inputNum;
while(inputNum!=-1){
BSTree* temp = new BSTree();
temp->value = inputNum;
temp->bsLeft = NULL;
temp->bsRight = NULL;
if(head == NULL){
head = temp;
}else{
p = head;
while(true){
if(temp->value <
p->value){
if(p->bsLeft == NULL){
p->bsLeft = temp;
break;
}
p = p->bsLeft;
}
if(temp->value >=
p->value){
if(p->bsRight == NULL){
p->bsRight = temp;
break;
}
p = p->bsRight;
}
}
}
cin>>inputNum;
//scanf("%d",&inputNum);
}
//read the BSTree
printBSTree(head);
cout<
cin>>inputNum;
while(inputNum!=-1){
head = deleteNode(head,inputNum);
if(head == NULL){
cout<
null!!";
break;
}
printBSTree(head);
cout<
cin>>inputNum;
}
return 0;
}
void printBSTree(BSTree* p)
{
if(p == NULL)
return;
BSTree* left = p->bsLeft;
BSTree* right = p->bsRight;
printBSTree(left);
printf("%d ",
p->value);
printBSTree(right);
return;
}
BSTree* deleteNode(BSTree* head, int value)
{
//循环遍历找到该值
BSTree* parent = head;
BSTree* p = head;
while(p != NULL){
if(value < p->value ){
parent = p;
p = p->bsLeft;
}
else if(value > p->value){
parent = p;
p = p->bsRight;
}
else
break;
}
if(p == NULL){
cout<
find!!"<
}
//如果都为空
if(p->bsRight==NULL
&&
p->bsLeft==NULL){
if(p==head){
delete p;
return NULL;
}
if(parent->bsLeft == p)
parent->bsLeft = NULL;
else if(parent->bsRight == p)
parent->bsRight = NULL;
delete p;
}
//如果有右子树
if(p->bsRight!=NULL){
BSTree* temp = p->bsRight;
BSTree* tempParent = p->bsRight;
while(temp->bsLeft!=NULL){
tempParent = temp;
temp = temp->bsLeft;
}
if(parent->bsLeft == p)
parent->bsLeft = temp;
else if(parent->bsRight == p)
parent->bsRight = temp;
if(temp!=tempParent){
tempParent->bsLeft =
temp->bsRight;
temp->bsLeft = p->bsLeft;
temp->bsRight =
p->bsRight;
}else{
temp->bsLeft = p->bsLeft;
}
if(head == p){
delete p;
return temp;
}
delete p;
}
//如果没有右子树
if(p->bsLeft!=NULL
&&
p->bsRight==NULL){
if(parent->bsLeft == p)
parent->bsLeft =
p->bsLeft;
else if(parent->bsRight == p)
parent->bsRight =
p->bsLeft;
if(p == head){
BSTree* temp = p->bsLeft;
delete p;
return temp;
}
delete p;
}
return head;
}
BSTree* searchNode(BSTree* head, int value, int
isParent)
{
BSTree* parent = head;
BSTree* p = head;
while(p != NULL){
if(value < p->value ){
parent = p;
p = p->bsLeft;
}
else if(value > p->value){
parent = p;
p = p->bsRight;
}
else{
if(isParent == 0)
return p;
else
return parent;
}
}
return head;
}