王道数据结构自学-二叉排序树(二叉查找树)

王道数据结构自学-二叉排序树(二叉查找树)

二叉排序树就是将比结点大的值放在右结点,比结点小的值放在左结点。

// 构建树的结构
typedef int KeyType;
typedef struct BSTNode
{
	KeyType key;
	BSTNode* lchild;//树的左孩子结点
	BSTNode* rchild;//树的右孩子结点
}BSTNode, * BiTree;

1 插入

  1. 首先判断被插入的结点是否存在,不存在的话先给这个结点申请空间初始化(将左右孩子置空,数值等于要插入的值)
  2. 如果存在,看一下元素是否一样,一样就不插入了
  3. 如果存在且值不一样,值小于结点的值就放入左子树,反之放入右子树
int BST_Insert(BiTree& T, KeyType k) {
	if (NULL == T) {
		//为新结点申请空间,第一个结点作为树根
		T = (BiTree)malloc(sizeof(BSTNode));
		T->key = k;
		T->lchild = T->rchild = NULL;
		return 1;//代表插入成功
	}
	else if (k == T->key) {
		return 0;//元素相同就不插入
	}
	else if(k < T->key)
	{
		return BST_Insert(T->lchild, k);
	}
	else
	{
		return BST_Insert(T->rchild, k);
	}
}

2 创建

  • 创建就是循环插入的过程
void Creat_BST(BiTree& T, KeyType str[], int n) {
	T = NULL;
	int i = 0;
	while (i < n) {
		BST_Insert(T, str[i]);//把某一个结点放入二叉树
		i++;
	}
}

3 查找

查找就是根据要查找的值比结点大还是比结点小的关系进行查找的过程。比结点大就要去右孩子查找,比结点小就要求左孩子查找,直至遍历完。

BSTNode* BST_Search(BiTree T, KeyType key, BiTree& p) {
	p = NULL;//存储要找的结点的父亲
	while (T != NULL && key != T->key) {
		p = T;
		if (key < T->key) {
			T = T->lchild;//比当前结点小,就左边找
		}
		else
		{
			T = T->rchild;//比当前结点大,就右边找
		}
	}
	return T;
}

4 删除

理解原理即可,考察代码几率不大

  • 被删除结点的左子树存在,右子树为空,左子树直接顶替结点
  • 被删除结点的左子树为空,右子树存在,右子树直接顶替结点
  • 被删除结点的左右子树都存在,采取用左子树最大值或者右子树最小值顶替结点的方法,选一个即可
void DeleteNode(BiTree& root, KeyType x) {
	if (root == NULL) {
		return;
	}
	if (root->key > x) {
		DeleteNode(root->lchild, x);
	}
	else if (root->key < x) {
		DeleteNode(root->rchild, x);
	}
	else//找到了要删除的结点
	{
		if (root->lchild == NULL) {//左子树为空,右子树直接顶上去
			BiTree tempNode = root;//用临时的存着的目的是一会要给他free
			root = root->rchild;
			free(tempNode);
		}
		else if (root->rchild == NULL) {//右子树为空,左子树直接顶上去
			BiTree tempNode = root;
			root = root->lchild;
			free(tempNode);
		}
		else//左右子树都不为空
		{//一般的删除策略是:左子树的最大数据 或 右子树的最小数据 代替删除的结点
			//这里采用使用左子树最大数据代替删除结点的方法
			BiTree tempNode = root->lchild;
			if (tempNode->rchild != NULL) {
				tempNode = tempNode->rchild;
			}
			root->key = tempNode->key;
			DeleteNode(root->lchild, tempNode->key);
		}
	}
}

点击下载源码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会挂科i

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值