#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
typedef int KeyType;
typedef struct{
KeyType key;
char otherinfo;
}ElemType;
typedef struct{
ElemType *r;
int length;
}SS,*SSTable;
int Search_Seq0(SSTable ST,KeyType key){
ST->r[0].key=key;
for(int i=1;i<=ST->length;i++){
if(ST->r[i].key==key){
return i;
}
}
return 0;
}
int Search_Seq(SSTable ST,KeyType key){
ST->r[0].key=key;
int i;
for(i=ST->length;ST->r[i].key!=key;i--);
return i;
}
int Search_Bin(SSTable ST,KeyType key){
int low=1,high=ST->length;
while(low<=high){
int mid=(low+high)/2;
if(key==ST->r[mid].key) return mid;
else if(key>ST->r[mid].key){
low=mid+1;
}
else high=mid-1;
}
return 0;
}
int SearchBinRecursion(SSTable ST,int key,int low,int high){
if(low>high) return 0;
int mid=(low+high)/2;
if(key==ST->r[mid].key) return mid;
else if(key>ST->r[mid].key)
return SearchBinRecursion(ST,key,(mid+1),high);
else SearchBinRecursion(ST,key,low,(mid-1));
}
typedef struct BSTNode{
ElemType data;
struct BSTNode *lch,*rch;
}BSTNode,*BSTree;
BSTree CreateBSTree(){
BSTree T;
ElemType tree;
scanf("%d-",
if(tree.key!=0){
T=(BSTree)malloc(sizeof(BSTNode));
T->data=tree;
T->lch=CreateBSTree();
T->rch=CreateBSTree();
}
else T=NULL;
return T;
}
BSTree InsertBST(BSTree T,int key){
ElemType e;
e.key=key;
e.otherinfo='f';
if(!T){
BSTree S=(BSTree)malloc(sizeof(BSTNode));
S->data=e;
S->lch=S->rch=NULL;
T=S;
}
else if(e.key<T->data.key)
T->lch=InsertBST(T->lch,key);
else if(e.key>T->data.key)
T->rch=InsertBST(T->rch,key);
return T;
}
int a[9]={5,3,2,1,4,7,6,8,-1};
int i=0;
BSTree CreatBST(){
BSTree T=NULL;
int key;
key=a[i++];
while(key!=-1){
T=InsertBST(T,key);
key=a[i++];
}
return T;
}
BSTree SearchBSTree(BSTree S,int key){
if((!S)||key==S->data.key) return S;
else if(key>S->data.key) S=SearchBSTree(S->rch,key);
else S=SearchBSTree(S->lch,key);
return S;
}
BSTree deleteNode(BSTree T){
BSTree p;
if(T->lch==NULL&=NULL){
p=T;
T=NULL;
free(p);
return T;
}
else if(T->rch==NULL){
p=T;
T=T->lch;
free(p);
return T;
}
else if(T->lch==NULL){
p=T;
T=T->rch;
free(p);
return T;
}
else{
BSTree parent=T;
BSTree pre=T->lch;
while(pre->rch){
parent=pre;
pre=pre->rch;
}
T->data=pre->data;
if(parent!=T){
parent->rch=pre->lch;
}
else{
T->lch=pre->lch;
}
free(pre);
return T;
}
}
BSTree DeleteBST(BSTree T,int key){
if(!T) return T;
else{
if(T->data.key==key)
T=deleteNode(T);
else if(key>T->data.key)
T->rch=DeleteBST(T->rch,key);
else T->lch=DeleteBST(T->lch,key);
return T;
}
}
int InOrder(BSTree T){
if(!T) return 0;
else{
InOrder(T->lch);
printf("%d ",T->data.key);
InOrder(T->rch);
}
}
BSTree pre=NULL;
BSTree Change(BSTree T){
BSTree p=T;
if(!p) return NULL;
else{
p->lch= Change(p->lch);
if(!p->lch){
p->lch=pre;
}
if(pre&&!pre->rch){
pre->rch=p;
}
pre=p;
p->rch=Change(T->rch);
}
return p;
}
BSTree ChangeB(BSTree T){
T=Change(T);
BSTree p=T; pre=NULL;
while(p->lch){
pre=p; p=p->lch;
if(p->rch!=pre && pre->lch!=p->rch){
pre->lch=p->rch;
}
}
pre=NULL;p=T;
while(p->rch){
pre=p;p=p->rch;
if(p->lch!=pre && pre->rch!=p->lch){
pre->rch=p->lch;
}
}
while(p->lch){
p=p->lch;
}
return p;
}
int main(){
BSTree T=CreatBST();
BSTree S=SearchBSTree(T,6);
printf("%d %p %p\n",S->data.key,S->lch,S->rch);
InOrder(T);printf("\n");
T=ChangeB(T);
while(T){
printf("%d ",T->data.key);
T=T->rch;
}
return 0;
}