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

Posted mr.chenyuelin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-二叉搜索树插入和删除相关的知识,希望对你有一定的参考价值。

转载: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);
 } 

以上是关于数据结构-二叉搜索树插入和删除的主要内容,如果未能解决你的问题,请参考以下文章

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

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

C++-二叉搜索树的查找&插入&删除-二叉搜索树代码实现-二叉搜索树性能分析及解决方案

二叉搜索树的插入,删除,和中序遍历

数据结构——搜索二叉树的插入,查找和删除(递归&非递归)

19. 二叉搜索树的插入删除修剪