二叉排序树→平衡二叉树→红黑树

二叉排序树

  1. 左子树的所有节点值小于根节点的值
  2. 右子树的所有节点值大于根节点的值
  3. 左右子树又分别是一棵二叉排序树
二叉排序树节点的删除
  1. 若删除的节点是叶子节点,直接删去
  2. 若删除的的节点有左子树且无右子树,则用左子树代替被删除节点、
  3. 若删除的的节点有右子树且无左子树,则用右子树代替被删除节点、
  4. 若删除的节点p同时有左右子树,为了删除后满足二叉排序树的定义,可以从其左子树选择关键字最大的节点r,用r的值替换p的值(节点值替换),并删除节点r(由于节点r一定没有右子树,删除它属于情况2)。
void Delete1(BSTNode * p,BSTNode * &r){//被删除节点p有左右子树,r指向其左孩子
	BSTNode * q;
	if(r->rchild!=null)//递归找节点r的最右下节点
		Delete1(p,r->rchild);
	else//找到了最右下节点r(它没有右子树)
	{
		p->key=r->key;//将节点r的值存到节点p
		p->data=r->data;
		q=r;
		r=r->lchild;//删除节点r,即用它的左孩子替代它
		free(q);//释放节点q的空间
	}
}

在这里插入图片描述


平衡二叉树

为了防止二叉排序树出现退化成链表的情况,出现了平衡二叉树(在二叉排序树的基础上新增规则:每个节点左子树的高度与右子树高度之差的绝对值不超过1)。一般情况下,一颗平衡二叉树总是二叉排序树。

平衡二叉树的调整

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
调整规则

  1. 假设找到某个节点的平衡因子为-2;其右孩子的平衡因子是-1,则作RR调整;其右孩子的平衡因子是1,则作RL调整;其右孩子的平衡因子是0,则做RR或RL调整均可。
  2. 假设找到某个节点的平衡因子为2;其左孩子的平衡因子是-1,则作LR调整;其左孩子的平衡因子是1,则作LL调整;其左孩子的平衡因子是0,则做LR或LL调整均可。

红黑树

一篇写得很好的博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值