#include<iostream>
#include<cstdlib>
using namespace std;
typedef int ElemType;
struct Node{
ElemType data;
Node *left,*right;
bool rTag,lTag;
};
void initThread(Node* &bt){
bt=NULL;
}
void insertThread(Node* &bt,const ElemType& item){
Node *child=bt,*parent=NULL;
while(child!=NULL){
parent=child;
if(item<child->data)
if(child->lTag==false)
child=child->left;
else
child=NULL;
else if(item>child->data)
if(child->rTag==false)
child=child->right;
else
child=NULL;
else
return;
}
Node* temp=new Node;
temp->data=item;
temp->lTag=temp->rTag=true;
if(parent==NULL){
temp->left=temp->right=NULL;
bt=temp;
}
else if(item>parent->data){
temp->right=parent->right;
parent->rTag=false;
parent->right=temp;
temp->left=parent;
}
else{
temp->left=parent->left;
parent->lTag=false;
parent->left=temp;
temp->right=parent;
}
}
void printTree(Node* bt){
if(bt!=NULL){
cout<<bt->data<<' ';
if(bt->lTag==false||bt->rTag==false){
cout<<'(';
if(bt->lTag==false)
printTree(bt->left);
if(bt->rTag==false){
cout<<',';
printTree(bt->right);
}
cout<<')';
}
}
}
Node* inorderNext(Node* bt){
if(bt->rTag==true)
return bt->right;
else{
bt=bt->right;
while(bt->lTag==false)
bt=bt->left;
return bt;
}
}
void inorderThread(Node* bt){
if(bt!=NULL){
while(bt->lTag==false)
bt=bt->left;
do{
cout<<bt->data<<' ';
bt=inorderNext(bt);
}while(bt!=NULL);
}
}
void display(Node* bt){
cout<<"Tree: ";
printTree(bt);
cout<<endl;
cout<<"inorder thread: ";
inorderThread(bt);
cout<<endl;
}
bool deleteThread(Node* &bt,const ElemType& item){
if(bt==NULL)
return false;
else{
if(item>bt->data)
if(bt->rTag==false)
return deleteThread(bt->right,item);
else
return false;
else if(item<bt->data)
if(bt->lTag==false)
return deleteThread(bt->left,item);
else
return false;
else{
if(bt->lTag==true&&bt->rTag==true){
Node* temp=bt;
if((bt->left!=NULL)&&(bt->left->right==temp)){
bt->left->rTag=true;
bt->left->right=bt->right;
}
else if((bt->right!=NULL)&&(bt->right->left=temp)){
bt->right->lTag=true;
bt->right->left=bt->left;
}
else{
bt=NULL;
}
delete temp;
return true;
}
else if(bt->lTag==true&&bt->rTag==false){
Node* temp=bt->right;
while(temp->lTag!=true){
temp=temp->left;
}
bt->data=temp->data;
return deleteThread(bt->right,temp->data);
}
else if(bt->lTag=false&&bt->rTag==true){
Node *temp=bt->left;
while(temp->rTag!=true){
temp=temp->right;
}
bt->data=temp->data;
return deleteThread(bt->left,temp->data);
}
else{
if(bt->left->rTag==true){
bt->data=bt->left->data;
return deleteThread(bt->left,bt->left->data);
}
else{
Node *parent=bt,*child=bt->left;
while(child->rTag!=true){
parent=child;
child=child->right;
}
bt->data=child->data;
return deleteThread(parent->right,child->data);
}
}
}
}
}
void clearThread(Node* &bt){
if(bt!=NULL){
if(bt->lTag==false)
clearThread(bt->left);
if(bt->rTag==false)
clearThread(bt->right);
delete bt;
bt=NULL;
}
}
int main(){
ElemType array[]={36,12,75,83,54,67,60,40,92,72};
Node* bt;
initThread(bt);
for(int i=0;i<10;i++)
insertThread(bt,array[i]);
display(bt);
for(int i=0;i<10;i++){
cout<<"***************** "<<array[i]<<" ***************"<<endl;
deleteThread(bt,array[i]);
display(bt);
}
clearThread(bt);
}
#include<cstdlib>
using namespace std;
typedef int ElemType;
struct Node{
ElemType data;
Node *left,*right;
bool rTag,lTag;
};
void initThread(Node* &bt){
bt=NULL;
}
void insertThread(Node* &bt,const ElemType& item){
Node *child=bt,*parent=NULL;
while(child!=NULL){
parent=child;
if(item<child->data)
if(child->lTag==false)
child=child->left;
else
child=NULL;
else if(item>child->data)
if(child->rTag==false)
child=child->right;
else
child=NULL;
else
return;
}
Node* temp=new Node;
temp->data=item;
temp->lTag=temp->rTag=true;
if(parent==NULL){
temp->left=temp->right=NULL;
bt=temp;
}
else if(item>parent->data){
temp->right=parent->right;
parent->rTag=false;
parent->right=temp;
temp->left=parent;
}
else{
temp->left=parent->left;
parent->lTag=false;
parent->left=temp;
temp->right=parent;
}
}
void printTree(Node* bt){
if(bt!=NULL){
cout<<bt->data<<' ';
if(bt->lTag==false||bt->rTag==false){
cout<<'(';
if(bt->lTag==false)
printTree(bt->left);
if(bt->rTag==false){
cout<<',';
printTree(bt->right);
}
cout<<')';
}
}
}
Node* inorderNext(Node* bt){
if(bt->rTag==true)
return bt->right;
else{
bt=bt->right;
while(bt->lTag==false)
bt=bt->left;
return bt;
}
}
void inorderThread(Node* bt){
if(bt!=NULL){
while(bt->lTag==false)
bt=bt->left;
do{
cout<<bt->data<<' ';
bt=inorderNext(bt);
}while(bt!=NULL);
}
}
void display(Node* bt){
cout<<"Tree: ";
printTree(bt);
cout<<endl;
cout<<"inorder thread: ";
inorderThread(bt);
cout<<endl;
}
bool deleteThread(Node* &bt,const ElemType& item){
if(bt==NULL)
return false;
else{
if(item>bt->data)
if(bt->rTag==false)
return deleteThread(bt->right,item);
else
return false;
else if(item<bt->data)
if(bt->lTag==false)
return deleteThread(bt->left,item);
else
return false;
else{
if(bt->lTag==true&&bt->rTag==true){
Node* temp=bt;
if((bt->left!=NULL)&&(bt->left->right==temp)){
bt->left->rTag=true;
bt->left->right=bt->right;
}
else if((bt->right!=NULL)&&(bt->right->left=temp)){
bt->right->lTag=true;
bt->right->left=bt->left;
}
else{
bt=NULL;
}
delete temp;
return true;
}
else if(bt->lTag==true&&bt->rTag==false){
Node* temp=bt->right;
while(temp->lTag!=true){
temp=temp->left;
}
bt->data=temp->data;
return deleteThread(bt->right,temp->data);
}
else if(bt->lTag=false&&bt->rTag==true){
Node *temp=bt->left;
while(temp->rTag!=true){
temp=temp->right;
}
bt->data=temp->data;
return deleteThread(bt->left,temp->data);
}
else{
if(bt->left->rTag==true){
bt->data=bt->left->data;
return deleteThread(bt->left,bt->left->data);
}
else{
Node *parent=bt,*child=bt->left;
while(child->rTag!=true){
parent=child;
child=child->right;
}
bt->data=child->data;
return deleteThread(parent->right,child->data);
}
}
}
}
}
void clearThread(Node* &bt){
if(bt!=NULL){
if(bt->lTag==false)
clearThread(bt->left);
if(bt->rTag==false)
clearThread(bt->right);
delete bt;
bt=NULL;
}
}
int main(){
ElemType array[]={36,12,75,83,54,67,60,40,92,72};
Node* bt;
initThread(bt);
for(int i=0;i<10;i++)
insertThread(bt,array[i]);
display(bt);
for(int i=0;i<10;i++){
cout<<"***************** "<<array[i]<<" ***************"<<endl;
deleteThread(bt,array[i]);
display(bt);
}
clearThread(bt);
}