二叉搜索树
自己写了一个不平衡的二叉搜索树,瞎打的,不知道对不对,主要用于之后写平衡树。
#include<cstdio> struct TreeNode{ int val; TreeNode *left,*right,*fa; }node[100010],root; int node_num; void tree_insert(TreeNode* k,TreeNode* now){ if(k==now) return; if(now->val>k->val){ if(now->left==NULL){ now->left=k; k->fa=now; } else tree_insert(k,now->left); } else if(now->val<=k->val){ if(now->right==NULL){ now->right=k; k->fa=now; } else tree_insert(k,now->right); } return; } TreeNode* tree_ques(int k,TreeNode* now){ if(now->val==k){ return now; } else{ if(k<=now->val){ if(now->left==NULL) return NULL; else return tree_ques(k,now->left); } if(k>now->val){ if(now->right==NULL&&now->fa==NULL) return NULL; else{ TreeNode *a=NULL; if(now->right!=NULL) a=tree_ques(k,now->right); if(a==NULL) return NULL; else return a; } } } return NULL; } void tree_delete(TreeNode* now){ TreeNode *l=now->left,*r=now->right,*f=now->fa; if(f==NULL){ if(l==NULL||r==NULL){ now->val=0; if(l!=NULL) l->fa=NULL; if(r!=NULL) r->fa=NULL; return; } else{ l->fa=NULL; r->fa=NULL; now->val=0; root=*l; tree_insert(r,l); return; } } else{ if(l==NULL&&r==NULL){ if(now==f->left) f->left=NULL; if(now==f->right) f->right=NULL; now->val=0; return; } if(l!=NULL) l->fa=NULL; if(r!=NULL) r->fa=NULL; if(l!=NULL){ l->fa=f; if(r!=NULL) tree_insert(r,f); now->val=0; return; } else{ tree_insert(r,f); now->val=0; return; } } return; } int n,q,x,p; int main(){ scanf("%d%d",&n,&q); for(int i=0;i<n;i++){ scanf("%d",&x); node[node_num].val=x; node[node_num].fa=NULL; node[node_num].left=NULL; node[node_num].right=NULL; tree_insert(&node[node_num],&node[0]); node_num++; } root=node[0]; while(q--){ scanf("%d",&p); if(p==1){ scanf("%d",&x); if(tree_ques(x,&root)!=NULL) printf("found.\n"); else printf("not found.\n"); } if(p==2){ scanf("%d",&x); while(tree_ques(x,&root)!=NULL){ tree_delete(tree_ques(x,&root)); } printf("Deleted.\n"); } if(p==3){ scanf("%d",&x); node[node_num].val=x; node[node_num].fa=NULL; node[node_num].left=NULL; node[node_num].right=NULL; tree_insert(&node[node_num],&root); printf("Inserted.\n"); } } return 0; }
就这样吧。