数据结构——c语言 二叉排序树

 戳这里还有其他 数据结构 的题目噢

https://blog.csdn.net/qq_45724947/article/details/115625130?spm=1001.2014.3001.5501


二叉树采用二叉链表结构表示,按输入的关键字序列建立一棵二叉排序树,并删除该二叉排序树上的某个结点。

 直接上代码:

//二叉排序数(二叉搜索树,二叉查找树)
#include<stdio.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>

using namespace std;
#define end 32767 // 定义结束标志

//结点结构
typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;


//二叉排序树的查找算法
//1.若查找到NULL,则搜索失败,否则:
//2.若x等于b的根节点的数据域的值,则查找成功;否则:
//3.若x小于b的根节点的数据域的值,则搜索左子树;否则:
//4.查找右子树。

bool SearchBST(BiTree T, int key, BiTree f, BiTree* p)
{
	//T为待查找的二叉树的根节点,会随着查找过程移动;
	//key为待查找的值
	//f指向T的双亲,如果查找不成功,p=f,插入过程使用;
	//p如果查找成功,则指向成功查找的结点,若不成功,则指向访问的最后一个结点,即f
	if (!T)
	{
		*p = f;
		return false;
	}
	else if (key == T->data)
	{
		*p = T;
		return true;
	}
	else if (key < T->data)
	{
		return SearchBST(T->lchild, key, T, p);
	}
	else if (key > T->data)
	{
		return SearchBST(T->rchild, key, T, p);
	}
}

//二叉排序树的插入算法
//先查找二叉树中有没有待插入的元素,如果有,则不插入;
//如果没有,则插入在访问的最后一个结点即p的左子树或者右子树 
bool InsertBST(BiTree* T, int key)
{
	BiTree p, s;
	if (!SearchBST(*T, key, NULL, &p)) //如果查找失败
	{
		s = (BiTree)malloc(sizeof(BiTNode));
		s->data = key;
		s->lchild = NULL;
		s->rchild = NULL;
		if (!p) // 二叉树为空,插入的s为根结点
		{
			*T = s;
		}
		else if (key < p->data)
		{
			p->lchild = s;
		}
		else if (key > p->data)
		{
			p->rchild = s;
		}
		return true;
	}
	else //如果查找成功
	{
		return false;
	}
}

//二叉排序树的创建—使用二叉排序树的插入算法进行
void CreateBST(BiTree* T)
{
	*T = (BiTree)malloc(sizeof(BiTNode));
	(*T)->lchild = NULL;
	(*T)->rchild = NULL;

	int c;
	scanf("%d", &c);
	if (*T && c != end)
	{
		(*T)->data = c;
	}
	while (c != end)
	{
		scanf("%d", &c);
		if (c != end && *T)
		{
			InsertBST(T, c);
		}
	}
}

//二叉排序树的删除算法
//两种情况:1、待删除的结点是叶子结点或该结点只有左子树或右子数
//2、待删除的结点既有左子树又有右子树
bool Delete(BiTree* p);
bool DeleteBST(BiTree *T, int key)
{
	if (!(*T)) // 如果没有查找到
	{
		return false;
	}
	else
	{
		if (key == (*T)->data)
		{
			return Delete(T);
		}
		else if (key < (*T)->data)
		{
			return DeleteBST(&(*T)->lchild, key);
		}
		else if (key >(*T)->data)
		{
			return DeleteBST(&(*T)->rchild, key);
		}
	}
}
bool Delete(BiTree* p)
{
	BiTree q = NULL;
	BiTree s = NULL;
	//情况1—左右子树有一个为空或都为空
	if ((*p)->lchild == NULL)
	{
		q = *p;
		*p = (*p)->rchild;
		free(q);
	}
	else if ((*p)->rchild == NULL)
	{
		q = *p;
		*p = (*p)->lchild;
		free(q);
	}
	//情况2—左右子树都不为空
	else
	{
		//不是直接删除该结点,而是用该结点的中序遍历前驱(左子树中最大的)替换为该结点
		q = *p; s = (*p)->lchild;
		while (s->rchild)
		{
			q = s;
			s = s->rchild;
		}
		(*p)->data = s->data;
		//然后再删除替换的结点,也分为两种情况
		//1、如果没有右子树,替换的结点就是待删除结点的左子结点,q = (*p)
		if (q == (*p))
		{
			q->lchild = s->lchild;
		}
		//2、如果有右子树,q != (*p)
		else
		{
			q->rchild = s->lchild;
		}
		free(s);
	}
	return true;
}

int main()
{
	BiTree T = NULL;
	//创建二叉排序树
	CreateBST(&T);

	//查找元素
	int key = 104;
	BiTree p = NULL;
	bool single = SearchBST(T, key, NULL, &p);
	if (single)
	{
		printf("查找成功");
	}
	else
	{
		printf("查找失败");
	}

	//删除元素
	int k = 105;
	DeleteBST(&T, k);

	return 0;
}

 

 (代码如有雷同,可能存在借鉴他人部分代码情况)

(请不要直接复制使用。总结的代码仅供参考,希望读者借此代码自身可以理解学习)

如果代码对您有帮助,不要忘记评论收藏噢~

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起当风萧

如果喜欢请支持一下~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值