【二叉查找树BST】二叉查找树的基本操作总结

二叉树就是一棵顺序树,优化查找效率。一组相同的数据所构造出来的二叉查找树不同。

  1. 二叉查找树的查找:(一个函数)
    struct Node{
    	int data;
    	Node* lchild,rchild;
    };
    //查找 
    void search(Node* root,int x){  //指向树的指针,要查找的树 
    	if(root==NULL) return;  //查找失败,递归边界
    	if(root->data==x){
    		printf("%d",root->data);  //找到了该数 
    	}else if(root->data>x){
    		search(root->lchild,x);
    	} else{
    		search(root->lchild,x);
    	}
    }
    

     

  2. 二叉查找树的插入:(一个直接函数,一个引用函数(node* newNode(int x)))
    
    //插入
    void insert(Node* &root,int x){
    	if(root==NULL){  //空树,递归边界 
    		Node* root=newNode(x);
    		return; 
    	}
    	if(root->data==x){  //已存在,直接返回 
    		return; 
    	}
    	else if(root->data>x){  //x小于根结点 
    		insert(root->lchild,x); 
    	}
    	else{
    		insert(root->rchild,x);
    	}
    } 
    
    Node* newNode(int x){
    	Node* node=new Node; //创建一个新的结点
    	node->data=x;  //给新节点赋值
    	node->lchild=node->rchild=NULL;  //设置新节点左右两边均为空 
    	return node; 
    }

     

  3. 二叉查找树的建立:(一个直接函数,一个引用函数(该函数含一个引用函数newNode(int x))
    //构建
    node* create(int data[],int n){  //插入一组数据,这组数据有n个数 
    	Node* node=NULL;  //新建根结点
    	for(int i=0;i<n;i++){
    		insert(root,data[i]);
    	}
    	return root; 
    } 

     

  4. 二叉查找树的删除:(三个直接函数)
    //删除
    
    //查找左子树中的最大值
    Node* findMax(Node* root){
    	while(root->rchild!=NULL){
    		root = root->rchild;
    	}
    	return root;
    } 
    
    //查找右子树中的最小值
    Node* findMin(Node* root){
    	while(root->lchild!=NULL){
    		root=root->lchild;
    	}
    	return rootl
    } 
    
    void deleteNode(Node* &root,int x){
    	if(root==NULL) return;
    	if(root->data==x){  //找到了x 
    		if(root->lchild==NULL&&root->rchild==NULL){
    			root=NULL;  //叶子结点直接删除 
    		}else if(root->lchild!=NULL){  //该结点左子树不为空,找左子树中最大值 
    			Node* pre=findMax(root->lchild);
    			root->data=pre->data;
    			deleteNode(root->lchild,pre->data);  //查找该结点的左子树,并删除那个结点 
    		}else if(root->rchild!=NULL){
    			Node* next=findMin(root->rchild);  //查找右子树中的最小值
    			root->data=next->data;
    			deleteNode(root->rchild,next->data);  //查找该结点的右子树,并删除那个结点 
    		} 
    	}else if(root->data>x){  //根结点大于x,向左查找 
    		deleteNode(root->lchild,x); 
    	}else{ //根结点小于x,向左查找 
    		deleteNode(root->rchild,x);
    	}
    }

     

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_之桐_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值