二叉排序树


```cpp
//一年以前 不理解二叉树,写起来很费劲,现在不费吹灰之力
typedef struct BiTnode
{
	int val;
	struct 	BiTnode*lchild,rchild;
}BiTnode,*BiTree;
BiTree res;                                           &res;
bool searchBST(BiTree root,int key,BiTree parent,BiTree *result)
{
	if(root==NULL)
	{
		*result=parent;
		return false;
	}
	else if(root->val==key)
	{
		*result=root;
		return true;
	}
	else if(key<root->val)
	{
		searchBST(root->lchild,key,root,result);
	}
	else 
	{
		searchBST(root->rchild,key,root,result);
	]
}

//二叉排序树插入操作
bool insertBST( BiTree*root,int key)
{
	BiTree res;
	BiTree newnode;
	if(!searchBST(root,key,NULL,&res))
	{
		newnode=(BiTree)malloc(sizeof(BiTree));
		newnode->val=key;
		#if 0
		if(root==NULL)
		{
			*root=newnode;
			return true;
		}
		else if(root->val>key)
		{
			
		}
		else 
		{
			
		}
		这一步就不用自己再写判断了,就用searchBST的结果,res返回的
		#endif
		if(res==NULL)//说明没有找到,返回最后一个节点,而它还是NULL的,说明root==NULL,
		{
			*root=newnode;
			return true;
		}
		else if(res->val<key)
		{
			res->rchild=newnode;
			return true;
		}
		else
		{
			res->lchild=newnode;
			return true;
		}
		
	}
	else
	{
		return false;
	}
}
							1               1->left=*Node;1->right=3;
		*node->2 			3

(NODE) 4
NODE如果把2删除了,我让Node指向4即可
//注意二级指针的用法, node的父节点一直指向的是node这个值,比如是0x12345678这个地址,所以我如果删除
node这个指向的值,只需让*Node指向它的左或者右孩子即可

void delete(BiTree *node)
{
	if(root->lchild==NULL&&root->rchild==NULL)
	{
		free(node);
		node=NULL;
	}
	else if(*node->lchild==null||*node->rchild==NULL)
	{
	#if 0
		BiTree tmp=*node;
		free(*node);
		if(node->lchild==NULL)
			tmp=node->rchild;
		else
			tmp=node->lchild;
	#endif
		BiTree q=*node;
		if(*node->lchild==NULL)
			node=(*node)->rchild;
		else
			node=(*node)->lchild;
		free(q);
	}
	else
	{
		BiTree tmp=*node;
		BiTree nextTmp=*node->lchild;
		while(nextTmp->rchild)
		{
			tmp=nextTmp;
			nextTmp=nextTmp->rchild;
		}
		*node->val=nextTmp->val;
		if(tmp!=node)
		{
			tmp->rchild=nextTmp->lchild;
		}
		else
		{/*
				1  1是待删除的节点,tmp=1,nexttmp=2,2->rchild为空,所以tmp和1相等,直接把1的左子树连接到nexttmp的左子树上.
			2
		3*/
			tmp->lrchild=nexttemp->lchild;//指针没有移动,
			free(nextTmp);
		}
	}
}
//二叉排序树删除操作
bool deleteBST(BiTree*root,int key)
{
	if(*root==NULL)
	{	
		return false;
	}
	else if(*root->val<key)//
	{
		deleteBST(&(*root->rchild),key);
	}
	else if(root->val>key)
	{
		deleteBST(&(*root->lchild),key);
	}
	else (root->val==key)
	{
		delete(root);
	}
	return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值