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

二叉排序树

  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调整均可。

红黑树

一篇写得很好的博客

### 如何区分二叉排序树平衡二叉树 #### 关键特性 二叉排序树(Binary Search Tree, BST)是一种特殊的二叉树,其定义为:对于任意节点,左子树上所有节点的值均小于该节点的值,而右子树上所有节点的值均大于该节点的值[^2]。这种结构使得二叉排序树非常适合用于动态集合操作,如查找、插入和删除。 然而,当数据分布不均匀或按顺序插入时,二叉排序树可能会退化成斜二叉树或链表形式,从而导致时间复杂度恶化到 O(n)[^1]。因此,为了保持高效的查询性能,引入了平衡二叉树的概念。 平衡二叉树(Balanced Binary Tree),也称为 AVL 树,是在二叉排序树基础上发展而来的一种自平衡二叉搜索树。它的核心特点是通过维护每个节点的高度差(Balance Factor, BF),即左右子树高度之差不超过 1 来实现整体平衡[^3]。一旦因插入或删除操作破坏此条件,则需执行特定旋转算法恢复平衡状态。 另外值得注意的是,在实际应用中还存在其他类型的近似平衡树种比如红黑树。虽然它们不像严格意义上的AVL那样追求极致均衡但依然能够提供较好的平均表现同时减少频繁调整带来的开销[^4]。 #### 判断方法 要辨别给定的一棵二叉树究竟是普通的BST还是更进一步满足约束条件成为AVL型态可以遵循如下准则: - **验证基本属性**:先确认目标对象确实属于标准意义下的二叉搜寻树范畴之内——也就是遍历过程中始终维持左侧数值较小右侧较大这一规律; - **检测高度差异限制**:接着针对每一个内部节点计算其所关联两支延伸部分各自所达到的最大层数差距是否恒处于[-1,+1]区间范围内;若是如此则可判定当前实例构成了一株合格的平衡版本;反之只要发现任一点超出上述界限即可断言并非真正意义上实现了自我调节机制后的最终形态。 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def is_balanced(root: TreeNode) -> bool: def check(node): if not node: return 0 left_height = check(node.left) if left_height == -1: return -1 right_height = check(node.right) if right_height == -1 or abs(left_height - right_height) > 1: return -1 return max(left_height, right_height) + 1 return check(root) != -1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值