二叉搜索树

自己写了一个不平衡的二叉搜索树,瞎打的,不知道对不对,主要用于之后写平衡树。

#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;
}
二叉搜索树

就这样吧。

posted @ 2017-11-16 17:40  Halifuda  阅读(131)  评论(0编辑  收藏  举报