二叉查找树 BST

六眼飞鱼酱① 提交于 2019-11-27 03:20:30

一、定义:

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

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

2.1查找操作

void search(node* root,int x){
    if(root==NULL){
        printf("Failed!");
        return;
    }
    if(x==root->data){
        printf("%d\n",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);
    }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!