C++ 二叉排序树BST(二叉查找树)

BST属于对无序集合排序查找算法中的一种,通过定义左小右大的规则放置无序集合中的元素,使得中序遍历能得到排序后的集合,并且任一子树都是二叉排序树。二叉排序树中右子树上任一元素大于该节点上左子树中全部元素,我是通过这个性质,写的删除,也叫后继删除。当然也可以前驱删除,从本质上来说是一样的。二叉排序树的建立、查找都是相当简单的,通过迭代、递归都可以实现,不断判断当前值是否大于小于当前节点,大于往右走,小于往左走,直到走到叶节点。删除要分为3种情况:1、叶节点可直接删除2、若只有右子树,则让右子树的根替换该节点,只有左子树的话同理3、有左右子树,找到删除节点的后继,用后继的值代替要删除节点的值,若后继有右子树又分为两种情况1、删除节点右子树上有左子树,用后继父节点的左指针指向后继的右子树2、删除节点的右子树没有左子树,那么右边的节点就代替了最左的后继,此时用后继父节点的右指针指向后继的右子树。具体就来看一看代码吧

#include<iostream>
#include<ctime>
using namespace std;

struct Node{
	int data;
	Node* left;
	Node* right;
};

void InOrderTranversal(Node* root){
	
	if(root==0){
		return;
	}
	
	InOrderTranversal(root->left);
	
	cout<<root->data<<endl;
	
	InOrderTranversal(root->right);
		
}

void release(Node* root){
	
	if(root==0){
		return;
	}
	
	release(root->left);
	release(root->right);
	
	delete root;
		
}

void search(Node*& root,int key,Node**& _result){
	
	if(root==0){
		_result=0;
		return;
	}
	
	if(key<root->data){
		search(root->left,key,_result);
	}
	else if(key==root->data){
		_result=&root;//put purpoes's addr to result for changing the purpoes pointer point another addr by _delete
		return;
	}
	else{
		search(root->right,key,_result);
	}
}

void insert(Node*& root,int value){
	
	if(root==0){
		root=new Node;
		root->left=0;
		root->right=0;
		root->data=value;
		return;
	}
	
	if(value>root->data){
		insert(root->right,value);
	}
	else if(value==root->data){
		return;
	}
	else{
		insert(root->left,value);
	}
}

bool _delete(Node*& root,int key){
	
	Node** node;
	search(root,key,node);
	
	if(node==0){
		return false;
	}
	
	Node* temp=*node;
	
	if((*node)->left==0&&(*node)->right==0){//leaf node can remove now
		*node=0;
		cout<<"0"<<endl;
		delete temp;
	}
	else if((*node)->left==0){//if has no left,make parent link to right and remove itself
		*node=(*node)->right;
		delete temp;
	}
	else if((*node)->right==0){
		*node=(*node)->left;
		delete temp;
	}
	else{
		//it must have left and right
		//my method is subsequent move,walk to end of right's left
		//s init to right
		//s_prent init to root
		Node* s=(*node)->right;
		Node* s_parent=*node;
		while(s->left!=0){
			s_parent=s;
			s=s->left;
		}
		
		temp->data=s->data;
		
		if(s->right!=0){//if end of right's left has right, it should replace end of right's left
			if(s_parent==*node){//if s_parent does not change,s_parent has had left tree,so it should put s'right to s_parent's right
				s_parent->right=s->right;
			}
			else{
				s_parent->left=s->right;
			}
		}
		else{
			if(s_parent==root){
				s_parent->right=0;
			}
			else{
				s_parent->left=0;
			}
		}
		
		delete s;
		
	}
	
	return true; 
	
}

int main(){
	
	srand(time(NULL));
	
	Node* root=new Node;
	root->left=0;
	root->right=0;
	root->data=10;
	
	for(int i=0;i<100;i++){
		insert(root,rand()%100);
	}
	
	InOrderTranversal(root);
	
	Node** _result;
	
	int value;
	cout<<"please cin the value you want to find:";
	cin>>value;
	
	search(root,value,_result);


	if(_result==0){
		cout<<"can't find purpoes!"<<endl;
	}
	else{
		cout<<"the result is:"<<(*_result)->data<<endl; 
	}
	
	cout<<"please cin the value you want to delete:";
	cin>>value;
	
	if(_delete(root,value)){
		InOrderTranversal(root);
		cout<<"delete succeed!"<<endl;
	} 
	else{
		cout<<"delete failed!"<<endl;
	}
	
	
	release(root);
	
	return 0;
}

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/nightwizard2030/article/details/72857219
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞