• 二叉查找树 BST


    一、定义:

    1. 要么二叉查找树是一棵空树
    2. 要么二叉查找树由根结点、左子树、右子树组成,其中左子树和右子树都是二叉查找树,且左子树上的所有节点的数据域都小于或等于根结点的数据域,右子树上所有节点的数据域都大于根结点的数据域。

    二、二叉查找树的基本操作

    2.1查找操作

    void search(node* root,int x){
        if(root==NULL){
            printf("Failed!");
            return;
        }
        if(x==root->data){
            printf("%d
    ",root->data);
        }else if(x>root->data){
            search(root->right,x);
        }else{
            search(root->left,x);
        }
    
    }

    2.2 插入操作

    void insert(node* &root,int x){
        if(root==NULL){
            root=newNode(x);
            return;
        }
        if(x==root->data){
            return;
        }else if(x<root->data){
            insert(root->left,x);
        }else{
            insert(root->right,x);
        }
    }

    2.3 建立二叉查找树

    node* create(int data[],int n){
        node* root=NULL;
        for(int i=0;i<n;i++){
            insert(root,data[i]);
        }
        return root;
    }

    2.4 删除某个节点

    把以二叉查找树中比结点权值最大结点称为该结点的前驱,把比结点权值最小结点称为该结点的后继

    //寻找root为根结点的树中的最大权值结点
    node* findMin(node* root){ while(root->left!=NULL){ root=root->right; } return root; }
    //寻找以root为根结点的树中的最小权值结点
    node* findMax(node* root){ while(root->left!=NULL){ root=root->left; } return root; }
    void deleteNode(node* root,int x){
        if(root==NULL)return;
        if(root->data==x){
            if(root->left==NULL && root->right==NULL){
                root=NULL;
            }else if(root->left!=NULL){
                node* pre=findMax(root->left);
                root->data=pre->data;
                deleteNode(root->left,pre->data);
            }else{
                node* nex=findMin(root->right);
                root->data=nex->data;
                deleteNode(root->right,nex->data);
            }
        }else if(root->data>x){
            deleteNode(root->left,x);
        }else{
            deleteNode(root->right,x);
        }
    }
  • 相关阅读:
    spoj 7001 Visible Lattice Points莫比乌斯反演
    codeforces 446C DZY Loves Fibonacci Numbers 数论+线段树成段更新
    fzu 1753 质因数的应用
    hud 4746 莫比乌斯反演
    hdu 1695 容斥原理或莫比乌斯反演
    hdu 4741 Save Labman No.004异面直线间的距离既构成最小距离的两个端点
    codeforces练习
    年底Android面试整理(附答案)
    最近Android真的凉凉了?
    Android 应用防止被二次打包指南
  • 原文地址:https://www.cnblogs.com/250101249-sxy/p/11341365.html
Copyright © 2020-2023  润新知