二叉排序树C/C++代码实现

二叉排序树(二叉查找树):

二叉排序树的一个重要性质:中序遍历一棵二叉 树时可以得到一个结点值递增的有序序列。

对于需要经常进行插入、 删除和查找运算的表,采用二叉排序树比较好

查找:

若二叉排序树为空,则查找失败,返回空指针。
若二叉排序树非空,将给定值key与根结点的关键字T->data.key进行比较:
1,若key等于T->data.key , 则查找成功,返回根结点地址;
2,若key小于T->data.key, 则递归查找左子树;
3,若key大于T->data.key , 则递归查找右子树。

时间复杂度O(log2n)

插入,创建:

若二叉排序树为空则直接插入为根结点,否则key小于根结点的话递归调用左子树插入,大于则递归调用右子树插入。

一个无序序列可以通过构造一棵二叉排序树而变成一个有序序列, 构造树的过 程即为对无序序列进行排序的过程。

输入的结点顺序不同,构造的二叉树不同,性能也不同
在这里插入图片描述

删除:

删除分三种情况:
1,被删除结点为叶子结点:
不会破坏整棵树的结构,只需将双亲结点指针置为NULL即可。

2,被删除结点只有左子树或只有右子树:
只需将被删除结点的左子树或右子树接到被删除结点的双亲结点相应处即可。
在这里插入图片描述
3,被删除结点既有左子树又有右子树:
由于中序遍历特点知:被删除结点前驱或后继只可能有一个孩子或没有孩子的情况。故直接前驱(或直接后继) 替代被删除结点, 然后再从二叉排序树中删去它的直接前驱(或直接后继)。
在这里插入图片描述

代码如下:

以该图为例:在这里插入图片描述

#include<stdio.h>

typedef int KeyType;
typedef int InfoType;
//二叉排序树的二叉链表储存
typedef struct
{
   
	KeyType key;
	InfoType otherinfo;
}ElemType;
typedef struct BSTNode
{
   
	ElemType data;
	struct BSTNode *lchild, *rchild;
}BSTNode, *BSTree;

//二叉排序树的插入
void InsertBST(BSTree &T, ElemType e)
{
   
	BSTree S;
	if (!T)				//如果是空树,直接插入根结点
	{
   
		S = new BSTNode;
		S->data = e;
		S->lchild = S->rchild = NULL;
		T = S;
	}
	else if (e.key < T->data.key)	//如果小于根结点则往左继续递归
	{
   
		InsertBST(T->lchild, e);
	}
	else if (e.key > T->data.key)	//如果大于根结点则往右继续递归
	
  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值