二叉树的建立遍历和删除都在这里了,感觉书上写的麻烦的,改简单一点还是能够AC的。
#include<bits/stdc++.h>
using namespace std;
struct Node{
int key;
Node *right,*left,*parent;
};
Node *root,*NIL;
void insert(int k){
Node *x=root;
Node *y =NULL;
Node *z=(Node *)malloc(sizeof(Node));
z->key=k;z->left=NULL;z->right=NULL;
while(x!=NULL){
y=x;
if(x->key>z->key){
x=x->left;
}
else x=x->right;
}
z->parent=y;
if(y==NULL)root=z;
else {
if(y->key>z->key){
y->left=z;
}
else y->right=z;
}
}
Node * find(Node *u,int k){
while(u!=NULL&&u->key!=k){
if(u->key>k)u=u->left;
else u=u->right;
}
return u;
}
Node * treeMinimum(Node *x){
while(x->left!=NULL)x=x->left;
return x;
}
//Node * treeSuccessor(Node *x){
// if(x->right!=NULL)return treeMinimum(x->right);
// Node *y=x->parent;
// while(y!=NULL&&x==y->right){
// x=y;
// y=y->parent;
// }return y;
//}
void treeDelete(Node *z){
Node *y;//要删除的对象
Node *x;//y的子结点
if(z->left==NULL||z->right==NULL)y=z;
else y=treeMinimum(z->right);
//确定y的子结点x
if(y->right!=NULL){
x=y->right;
}else
x=y->left;
if(x!=NULL)x->parent=y->parent;
if(y->parent==NULL){
root=x;
}else{
if(y==y->parent->left)y->parent->left=x;
else y->parent->right=x;
}
if(y!=z)z->key=y->key;
free(y);
}
void inorder(Node *u){
if(u==NIL)return ;
inorder(u->left);
printf(" %d",u->key);
inorder(u->right);
}
void preorder(Node *u){
if(u==NIL)return ;
printf(" %d",u->key);
preorder(u->left);
preorder(u->right);
}
int main(){
int n,i,x,k;
string com;
scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>com;
if(com=="insert"){
scanf("%d",&x);
insert(x);
}else if(com=="print"){
inorder(root);
printf("\n");
preorder(root);
printf("\n");
}
else if(com=="find"){
scanf("%d",&k);
if(find(root,k)!=NULL)printf("yes\n");
else printf("no\n");
}
else if(com=="delete"){
scanf("%d",&k);
treeDelete(find(root,k));
}
}
} ```