漫谈: 数据结构平衡二叉树

简介

平衡二叉树, 是由普通二叉树, 二叉查找树根据元素插入规则和保持左右子树平衡的旋转规则而来,本文只简单介绍这三种树的区别和联系;

二叉树

节点:

  1. 一个树只有一个根节点;
  2. 一个节点存储, 节点值, 父节点地址, 右子节点地址, 左子节点地址;
    二叉树唯一的规则就是每个节点的度必须小于等于2, 何为度: 树结构中每个节点的子节点个数称之为 , 还有一个树的高度,
    也就是这个树的总层数;
    在这里插入图片描述
    二叉树只要保证每个节点的度<=2即可, 对于元素的插入规则是没有要求的;

二叉查找树

查找一词, 说明二叉查找树的查找效率很高, 至少比普通二叉树的查找效率高,毕竟它不是胡乱插入节点的;

二叉查找树的插入规则:
  1. 节点值相同不插入
  2. 节点值大于比较节点值,插入到比较节点的右边(如果右边有节点存在, 继续重复比较);
  3. 节点值小于比较节点值,插入到比较节点的左边(如果左边有节点存在, 继续重复比较);
    在这里插入图片描述
    上图就展示了二叉查找树的节点插入规则;
    但是我们发现一个问题, 插入完成之后, 二叉查找树变得非常不平衡;
    在这里插入图片描述
    根节点的左右子树的高度非常不平衡: 让我们来优化一下:
    在这里插入图片描述
    我们这里使用了一些规则,让二叉查找树变成了如上图所示排列方式:
    现在我问一个问题, 我需要查找节点值为2的节点, 原始的二叉查找树和平衡过后的二叉查找树, 谁要快写呢:
    原始的: 7 > 5 > 4 > 2 : 一共比较了4次找到了2节点;
    平衡的: 5 > 4 > 2; 一共比较了3次找到了2节点;
    根据比较, 平衡的二叉树只比原始的减少了一次比较, 并没有很大的提升. 但是注意, 我们的树很低, 如果树高1万层呢? 平衡树和原始树在树的高度上会相差很大, 从而原始树的查找次数也会增大, 时间复杂度和链表的O(n)一样.

平衡二叉查找树

在规则上, 平衡树在二叉查找树上增加了一条: 每个节点的左右子树的高度差<= 1; 如果超过, 就必须按照旋转规则, 将树维持平衡;

旋转规则

左旋: 以某个节点为轴, 向左旋转
右旋: 以某个节点为轴, 向右旋转

左左

根节点的左子树的左子树有节点插入时, 导致二叉树不平衡, 直接右旋解决;
在这里插入图片描述
此时根节点的左右子树高度差值为2, 以根节点为轴, 右旋;
在这里插入图片描述
此时7节点降级, 当前根节点的右子节点5作为降级根节点的左子节点;

左右

在根节点的的左子树的右子树有节点插入的情况;
在这里插入图片描述
上图中1节点有误, 视为6节点即可:
以左子树的根节点为轴局部左旋:
在这里插入图片描述
然后以根节点为轴局部右旋:
在这里插入图片描述
此时7节点降级, 当前根节点的右子节点6作为降级根节点的左子节点;

右右

在根节点的右子树的右子树有节点插入时;
以根节点左旋即可

右左

在根节点的右子树的左子树有节点插入时
根节点右子树右旋, 根节点整体左旋;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值