数据结构-二叉搜索树插入和删除

转载:https://blog.csdn.net/xiexiexiexieqing/article/details/117468490
插入:


void in(struct TREE*tree,struct DATA data)
{
	struct node*pmove=tree->root;          //pmove先等于搜索树的根节点 pmove 在前面探路 
	struct node*pnode=NULL;                //pnode 紧跟在 pmove 的后面 
	struct node*newnode=createnode(data); // 调用 方法 
	while(pmove)                          //先 通过 插入规则 探路 
	{
		pnode=pmove;                    
		if(newnode->data.a > pmove->data.a)
		pmove=pmove->right;
		else
		pmove=pmove->left;
	}
	if(tree->root==NULL)                //后 分类讨论 在合适的位置插入 新节点(newnode)
	tree->root=newnode;
	else
	{
		if(newnode->data.a > pnode->data.a)
		pnode->right=newnode;
		else
		pnode->left=newnode; 
	}
 } 

删除:
分为2种情况:

1.删除节点的子节点都存在

就直接去找 它的左边最大 或者 右边最小 用 两者之一 在释放 这个最值节点
在这里插入图片描述

2.删除节点的子节点最多存在一个

直接让删除节点的父节点 连接 删除节点的子节点 释放删除节点

在这里插入图片描述

//删除
void del(struct node*root,int data)
{
	struct node*pnode=root;   
	struct node*pnodeparent;
	while(pnode!=NULL && pnode->data!=data)  //先找到这个节点 
	{
		pnodeparent=pnode;       //父节点必须在子节点上面 
		if(data>pnode->data)
		pnode=pnode->right;
		else
		pnode=pnode->left;
	}
	if(pnode==NULL)    //当pnode为空 意思是把这颗树都找遍了 还是没有 
	{
		printf("没有");   //所以 返回时  要有一个提示 
		return ;
	}
	if(pnode->left!=NULL&&pnode->right!=NULL)  //删除节点的子节点都存在 
	{
		struct node*pmove=pnode->left;     //找左边的最大节点 
		struct node*pmoveparent;
		while(pmove->right!=NULL)
		{
			pmoveparent=pmove;
			pmove=pmove->right;
		}
		pnode->data=pmove->data;  //把这个最大节点的值赋给 删除节点 
		pnode=pmove;              //现在相当于删除这个 最大节点 
		pnodeparent=pmoveparent;
	}
	struct node*snode;      //定义一个节点 
	if(pnode->left!=NULL)   //获取 最大节点的子节点 
	snode=pnode->left;
	else                     //不存在子节点就赋值NULL 
	snode=NULL;         
	if(pnodeparent==NULL)  //如果父节点为空那么就是 空树  还是把获取到的节点给它 
	pnodeparent=snode;
	else if(pnodeparent->right==pnode)
	pnodeparent->right=snode;
	else
	pnodeparent->left=snode;
	free(pnode);
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值