算法 操作二叉查找树

参考《数据结构与算法分析


二叉查找树的建立:

typedef struct binary_tree_
{
	int data;
	struct binary_tree_ *left;
	struct binary_tree_ *right;
}binary_tree;  //这里binary_tree = struct binary_tree_

二叉查找树创建一个根节点:

binary_tree* create_tree(int data)  //创建一个根节点 
{
	binary_tree* root=NULL;
	root=(binary_tree*)malloc(sizeof(struct binary_tree_));
	root->data=data;
	root->left=NULL;
	root->right=NULL; 
	return root;
} 

 

二叉查找树的查找:

binary_tree* find(int data,binary_tree *T)  //二叉查找树的查找 
{
	if(T==NULL)
		return NULL;
	if(data<T->data)
		return find(data,T->left);
	if(data>T->data)
		return find(data,T->right);
	if(data==T->data)
		return T;
} 

二叉查找树寻找最小值递归实现:

binary_tree* findmin1(binary_tree *T)  //不断向左找,找到最左端,递归实现 
{
	if(T==NULL)
		return NULL;
	if(T->left==NULL)
		return T;
	if(T->left!=NULL)
		return findmin1(T->left);
}

二叉查找树寻找最小值递归实现:

binary_tree* findmin2(binary_tree *T)  //不断向左找,找到最左端,非递归实现 
{
	if(T!=NULL)
		while(T->left!=NULL)
			T=T->left;
	return T;
}

二叉查找树的插入:

binary_tree* insert(int data,binary_tree *T)   //二叉查找树的插入,返回的还是根节点 
{
	if(T==NULL)   //找到一个空位 
	{
		T=(binary_tree*)malloc(sizeof(struct binary_tree_));
		T->data=data;
		T->left=NULL;
		T->right=NULL;
		
	}
	else if(data<T->data)
		T->left=insert(data,T->left);   //向左继续搜索 
	else if(data>T->data)
		T->right=insert(data,T->right);  //向右搜索 
	return T;	
}


二叉查找树的删除:

binary_tree* del(int data,binary_tree *T)   //二叉查找树的删除 
{
	binary_tree *temp;
	if(data<T->data)
		T->left=del(data,T->left);
	else if(data>T->data)
		T->right=del(data,T->right);
	else if(T->left!=NULL && T->right!=NULL)  //两个子树 
	{
		temp=findmin1(T->right);
		T->data=temp->data;
		T->right=del(T->data,T->right); 
	}
	else //一个或者没有子树 
	{
		temp=T;
		if(T->left==NULL) //右子树或有或没有
			T=T->right;
		else if(T->right==NULL)  //左子树一定有 
			T=T->left;
		free(temp);
	}	
	return T;
} 
在删除代码中,有几个定理便于帮助理解:

若左子树非空,则左子树上所有结点的值均小于它的根节点的值。

子树非空,则子树上所有结点的值均于它的根节点的值。

根据这两条定理,找到待删除的结点后,将它的右子树结点们的最小值和待删除结点的值进行替换,然后继续向下搜索,寻找刚才替换的值,直到到达末端。


下面进行一下测试

int main(void)
{
	binary_tree *root;
	binary_tree *root1;
	root=create_tree(3);
	root=insert(2,root);
	root=insert(4,root);
	root1=findmin1(root);
	root=del(3,root);
	printf("%d",root->data);
	printf("%d",root1->data);
	
	return 0;
} 
函数都可以运行正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值