zoukankan      html  css  js  c++  java
  • 二叉搜索树

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

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

    就这样吧。

  • 相关阅读:
    git stash功能的使用
    git tag的应用
    git merge 与 git rebase的区别?
    git的一些操作命令
    docker的常用操作
    lvs搭建dr负载均衡集群
    centos8安装lvs
    centos8安装docker
    centos8用firewalld搭建防火墙
    openresty上安装waf
  • 原文地址:https://www.cnblogs.com/halifuda/p/7845500.html
Copyright © 2011-2022 走看看