数据结构:搜索二叉树 | 平衡二叉树

这篇具有很好参考价值的文章主要介绍了数据结构:搜索二叉树 | 平衡二叉树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

博客写的代码都放在这里:gitee仓库链接

1.二叉搜索树
1.1.基本概念

二叉搜索树又称二叉排序树,可以为空,如果不为空具有以下性质的二叉树:

  • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  • 它的左右子树也都为二叉搜索树

数据结构:搜索二叉树 | 平衡二叉树,数据结构

1.2.二叉搜索树的结点结构
struct TreeNode
{
    TreeNode<T>* _left;
    TreeNode<T>* _right;
    T _key;

    TreeNode(T key)
        :_left(nullptr)
        , _right(nullptr)
        , _key(key)
    {}
};
1.3二叉搜索树的代码实现

1.二叉搜索树的插入

实现思路:

数据结构:搜索二叉树 | 平衡二叉树,数据结构

  1. 如果树为空,直接插入节点
  2. 如果树不为空,找到待插入位置(cur)的父节点(parent)
  3. 判断待插入的节点(cur)的值是否小于或大于父节点(parent)的值,插入对应的左边或右边
bool Insert(const T& key)

2.二叉搜索树的删除

实现思路:

删除的节点有两大类:1.没有子树或者只有一颗子树 2.有两颗子树

第一类的解决方式是:找到当前待删除的节点和其父节点,然后直接让父节点指向带待删除结点的子树(左子树和右子树)

数据结构:搜索二叉树 | 平衡二叉树,数据结构

  1. 把NULL也看成是一个特殊结点(最好的认识!
  2. 分别删除4和14,让parent指向cur的子树(左或右,说明这里就需要判断了);这里4的子树都是NULL,但是这里看成左子树和右子树都是可以的(只是我习惯从左往右)

第二类的解决方法是:使用替换法

数据结构:搜索二叉树 | 平衡二叉树,数据结构

  1. 找到一个结点和当前结点进行交换,怎么找一个符合的结点呢?将当前节点(cur)和左子树的最大节点(最右节点)或者右子树最小节点(最左节点)进行替换。
  2. 如这里删除3和8,找到leftMax说明已经是最右边的结点了!就让parent指向leftMax的左子树
bool Erase(const T& key);
1.4.二叉搜索树的性能

当二叉搜索树为完全二叉树,或者接近完成二叉树的时,它的插入或者说查找效率时log2(N),但是但插入的数据有序或或者接近有序,那么就会退化成O(N)。数据结构:搜索二叉树 | 平衡二叉树,数据结构

所以,为了解决退化问题,可以使用平衡二叉树的红黑树来解决!

2.平衡二叉树

二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查

找元素相当于在顺序表中搜索元素,效率低下

当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度,搜索时间复杂度O(log2N)

平衡因子(bf) = 右子树的高度 - 左子树的高度

2.1平衡二叉树结点的定义
struct AVLTreeNode
{
    std::pair<K, V> _kv;
    AVLTreeNode<K,V>* _left;
    AVLTreeNode<K,V>* _right;
    AVLTreeNode<K,V>* _parent;
    int _bf;

    AVLTreeNode(const std::pair<K, V> kv)
        :_kv(kv)
        , _left(nullptr)
        , _right(nullptr)
        , _parent(nullptr)
        , _bf(0)
    {}
};
2.2.平衡二叉树代码实现
1.插入结点
bool insert(const std::pair<K, V>& kv)

实现思路分为两步:

  1. 按照二叉搜索树的方式插入新节点
  2. 调整节点的平衡因子(不平衡是通过旋转来平衡,将调整平衡的树的平衡因子作修改)
2.判断是否是平衡二叉树
bool banlan(){}
2.3.平衡二叉树的旋转
  • 左单旋

数据结构:搜索二叉树 | 平衡二叉树,数据结构

  1. 根据二叉搜索树的方法,将结点88插入45的右子树,插入成功;成功之后要修改 ? 平衡因子,并判断是否要调整平衡!
  2. 当parent == 0时说明完全平衡,不用调整;等parent的绝对值为1时,有一侧偏高了,需要往上找上祖先;当parent的绝对值是,就需要平衡以parent为根的树(或子树)!

数据结构:搜索二叉树 | 平衡二叉树,数据结构

需要左旋转,调整平衡!

步骤:

数据结构:搜索二叉树 | 平衡二叉树,数据结构

  1. 将cur的左子树,作为parent的右子树;将parent作为cur的左子树
  2. 修改移动节点的_parent指向关系
  3. 修改parent和cur的平衡因子,都修改成0

**一般情况:**上面是左单旋的其中一个例子,实际上随着层数的增高,左边旋的情况,无穷无尽,但是旋转的步骤都是一样的,来分析一下:

数据结构:搜索二叉树 | 平衡二叉树,数据结构

可以不同的数对高度h代入,得到不同情况的树。

  • 右单旋

数据结构:搜索二叉树 | 平衡二叉树,数据结构

注意参考,左单旋!

  • 左右双旋

数据结构:搜索二叉树 | 平衡二叉树,数据结构

注意参考,右左选旋!

  • 右左双旋

数据结构:搜索二叉树 | 平衡二叉树,数据结构

  1. 先以100为节点做右单旋,再以50为节点做左单旋
  2. 调整平衡因子,怎么调整呢,分为三种情况:

数据结构:搜索二叉树 | 平衡二叉树,数据结构

数据结构:搜索二叉树 | 平衡二叉树,数据结构

上面的两种情况都是h > 0的情况,我们来看看h = 0的情况是怎么样的

数据结构:搜索二叉树 | 平衡二叉树,数据结构

通过三种情况发现,双旋后的平衡因子调整和60的平衡因子相关。

2.4.平衡二叉树的性能

AVL树是一棵绝对平衡的二叉搜索树,其要求每个节点的左右子树高度差的绝对值都不超过1,这样就可以保证高效的查找(O(log2(N)))。但是如果要对AVL树做一些结构修改的操作,性能非常低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置。

因此:如果需要一种查询高效且有序的数据结构,而且数据的个数为静态的(即不会改变),可以考虑AVL树,但一个结构经常修改,就不太适合。文章来源地址https://www.toymoban.com/news/detail-819014.html

到了这里,关于数据结构:搜索二叉树 | 平衡二叉树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构之二叉树和平衡二叉树

    1、二叉树: 2、平衡二叉树:

    2024年04月17日
    浏览(30)
  • 数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)

    目录 基本介绍 平衡因子 平衡二叉树  平衡二叉树的高度  什么是平衡二叉树? 以一个例子来解释一下: 搜索树结点按不同的插入次序,将会导致不同的深度和平均查找长度ASL   在二叉搜索树中查找一个元素:  (a)要找到Jan,需要查找一次;要找到Feb,需要查找两次;

    2023年04月26日
    浏览(45)
  • 数据结构之平衡二叉树的平衡调整

    1:LL型调整 2:RR型调整 3:LR型调整 4:RL型调整 5:总结 作者约定:将导致不平衡的结点称作 被破坏者 ,破坏了结点的平衡的结点成为 破坏者 ,经过调整可以让该树平衡的结点称为 调整结点 。 LL型不平衡调整方法:以调整结点为中心,进行右旋操作,就可以使树平衡。

    2024年02月09日
    浏览(33)
  • 数据结构之平衡二叉树详解

    平衡二叉树(balanced binary tree) 又称AVL树(Adelson-Velskii and Landis) 一棵平衡二叉树或者是空树,或者是具有下列性质的 二叉排序树 :         1,左子树与右子树的高度之差的绝对值小于等于1;         2,左子树和右子树也是平衡二叉排序树. 为了方便起见,给每

    2024年02月03日
    浏览(32)
  • 【数据结构】二叉排序树——平衡二叉树的调整

    参考视频: 懒猫老师-数据结构-(59)平衡二叉树【互动视频】 (1)什么是平衡二叉树 平衡二叉树(Balanced Binary Tree)是一种特殊的二叉查找树,它的目的是保持树的高度尽量平衡,以保证查找、插入、删除等操作的时间复杂度为 O(log n)。 常见的平衡二叉树算法包括 AVL 树、红

    2024年02月04日
    浏览(32)
  • 【数据结构与算法】平衡二叉树(AVL树)

    给你一个数列{1,2,3,4,5,6},要求创建二叉排序树(BST),并分析问题所在。 BST 存在的问题分析 : 左子树全部为空,从形式上看,更像一个单链表。 插入速度没有影响。 查询速度明显降低(因为需要依次比较),不能发挥 BST 的优势,因为每次还需要比较左子树,其查询速度

    2024年02月13日
    浏览(33)
  • 数据结构-各种树(二叉树、二叉查找树、平衡二叉树、红黑树、B树、B+树)

    概念:二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树 特点:每个

    2024年02月09日
    浏览(36)
  • Java常见的数据结构:栈、队列、数组、链表、二叉树、二叉查找树、平衡二叉树、红黑树

    数据结构是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率 栈 队列 数组 链表 二叉树 二叉查找树 平衡二叉树 红黑树... 后进先出,先进后出 数据进入栈模型的过程称为

    2024年02月07日
    浏览(28)
  • 【数据结构】二叉查找树和平衡二叉树,以及二者的区别

    目录 1、二叉查找树 1.1、定义  1.2、查找二叉树的优点  1.2、查找二叉树的弊端 2、平衡二叉树 2.1、定义 2.2、 实现树结构平衡的方法(旋转机制) 2.2.1、左旋 2.2.2、右旋 3、总结        二叉查找树又名二叉排序树,亦称二叉搜索树。是每个结点最多有两个子树的树结构

    2024年02月20日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包