首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

倾斜二分搜索树的高度

倾斜二分搜索树(Skewed Binary Search Tree)是指在二分搜索树(BST)中出现极端不平衡的情况,即树的一侧分支非常长,而另一侧分支非常短。这种不平衡会导致搜索、插入和删除操作的效率降低,最坏情况下时间复杂度可能退化到O(n),其中n是树中节点的数量。

基础概念

二分搜索树是一种特殊的二叉树,其中每个节点的左子树中的所有节点值都小于该节点的值,右子树中的所有节点值都大于该节点的值。理想情况下,二分搜索树是平衡的,即任何节点的两个子树的高度差不超过1。

相关优势

  • 平衡状态:在平衡状态下,二分搜索树的搜索、插入和删除操作的时间复杂度为O(log n)。
  • 结构特性:二分搜索树的结构使得这些操作非常高效。

类型

  • 普通二分搜索树:标准的二分搜索树,可能不平衡。
  • 平衡二分搜索树:如AVL树、红黑树等,通过特定的平衡机制保持树的平衡。

应用场景

  • 数据存储:用于实现高效的查找、插入和删除操作。
  • 数据排序:二分搜索树可以用于对数据进行排序。

问题与原因

倾斜二分搜索树的问题在于其不平衡性,这通常是由于插入和删除操作没有很好地维护树的平衡性。例如,如果数据已经有序,每次插入都会导致树的一侧增长,形成倾斜。

解决方法

为了避免倾斜二分搜索树的问题,可以使用自平衡二分搜索树,如AVL树或红黑树。这些树通过旋转操作来维护树的平衡。

AVL树示例代码(Python)

代码语言:txt
复制
class TreeNode:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None
        self.height = 1

class AVLTree:
    def insert(self, root, key):
        if not root:
            return TreeNode(key)
        elif key < root.key:
            root.left = self.insert(root.left, key)
        else:
            root.right = self.insert(root.right, key)

        root.height = 1 + max(self.getHeight(root.left), self.getHeight(root.right))

        balance = self.getBalance(root)

        # Left Left Case
        if balance > 1 and key < root.left.key:
            return self.rightRotate(root)

        # Right Right Case
        if balance < -1 and key > root.right.key:
            return self.leftRotate(root)

        # Left Right Case
        if balance > 1 and key > root.left.key:
            root.left = self.leftRotate(root.left)
            return self.rightRotate(root)

        # Right Left Case
        if balance < -1 and key < root.right.key:
            root.right = self.rightRotate(root.right)
            return self.leftRotate(root)

        return root

    def leftRotate(self, z):
        y = z.right
        T2 = y.left

        y.left = z
        z.right = T2

        z.height = 1 + max(self.getHeight(z.left), self.getHeight(z.right))
        y.height = 1 + max(self.getHeight(y.left), self.getHeight(y.right))

        return y

    def rightRotate(self, y):
        x = y.left
        T2 = x.right

        x.right = y
        y.left = T2

        y.height = 1 + max(self.getHeight(y.left), self.getHeight(y.right))
        x.height = 1 + max(self.getHeight(x.left), self.getHeight(x.right))

        return x

    def getHeight(self, root):
        if not root:
            return 0
        return root.height

    def getBalance(self, root):
        if not root:
            return 0
        return self.getHeight(root.left) - self.getHeight(root.right)

参考链接

通过使用自平衡二分搜索树,可以确保树的高度始终保持在O(log n),从而保证操作的高效性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

二分搜索详解

二分搜索基础 在介绍二分搜索之前我们先来看二叉,二叉是最基本树形结构,二叉由一个根节点和多个子节点组成,包括根节点在内每个节点最多拥有左右两个子节点,俗称左孩子和右孩子。...我们先来编写二分搜索树节点结构以及二分搜索基础属性和方法,代码如下: /** * @author 01 * @program Data-Structure * @description 二分搜索...这样选择合适终止条件后,多递归了一层但减少很多不必要代码 * * * 二分搜索查询操作 有了前面的基础后,通过递归实现二分搜索查询操作就很简单了,只需要比较元素大小,不断地递归就能找到指定元素...,接下来我们看看二分搜索层序遍历。...:最短路径 * * * 删除二分搜索最大元素和最小元素 二分搜索删除操作是相对比较复杂,所以我们先来解决一个相对简单任务,就是删除二分搜索最大元素和最小元素。

40620
  • 《python算法教程》Day8 - 构建二分搜索二分搜索介绍二分搜索创建代码

    今天是《python算法教程》第8篇读书笔记,笔记主要内容是构建二分搜索二分搜索介绍 若要对一组有序值中执行操作(如查找),二分搜索法是一个优秀选择,因为其时间复杂度仅为对数级。...但很多时候,对序列操作不仅仅是查找,还涉及到插入新数据。若此时选用数组作为存储数据结构,插入数据时间复度是线性级,显然无法满足快速插入数据需求。...因此,这里引入二分搜索这一既能利于二分搜索又能以对数级时间完成搜索数据结构。 二分搜索创建代码 二分搜索是一个对象,其提供插入、搜索节点和判断是否存在某个节点方法。...#构建二分搜索 #二分搜索节点自定义类 class Node: lft=None rgt=None def __init__(self,key,val):...key<node.key: return search(node.lft,key) else: return search(node.rgt,key) #定义二分搜索

    766130

    二分搜索(Binary Search Tree)

    二叉如下图: 什么是二分搜索?   二分搜索也是一种二叉,但二分搜索树种每个节点值都要大于其左子树所有节点值,小于其右子树所有节点值,每一棵子树也是二分搜索。...正因为二分搜索这种性质,二分搜索存储元素必须具有可比较性。...下图就是一棵二分搜索: 我们可以根据二分搜索特点,构建一颗二分搜索,代码实现如下: /** * 由于二分搜索元素必须具有可比较性,所以二分搜索中存储数据必须要实现Comparable...二分搜索添加新元素   我们在向二分搜索中添加元素时,需要保持二分搜索性质,即需要将我们添加元素从根节点开始比较,若比根节点小,则去根节点左子树递归进行添加操作,若比根节点右子树递归进行添加操作...二分搜索学习就到这里了,希望本文能让你对二分搜索有更深理解。

    15110

    推导B最大高度和最小高度得出B高度范围

    前提条件:n>=1,则对于任意一棵包含n个关键字、高度为h、阶数为mB。 一、最小高度: 对于任意类型数据结构,如果其每层节点能够分布足够满,其高度也会随之变得足够低。...基于这个思路,对于B无外乎也是一种,B关键字数以及儿子节点个数满足这样条件(ceil代表向上取整): //根节点 儿子节点个数[2, m] 关键字个数[1, m-1] //非根节点 儿子节点个数...[ceil(m/2), m] 关键字个数[ceil(m/2)-1, m-1] 为了使得B高度最低,也就是每层节点数达到最大,看如下计算过程: 二、最大高度: 要使得B高度达到最大,也就意味着在每个节点中...,关键字个数达到最小,这样在容纳相同个数关键字B中,其高度可以达到最大。...有了上边我们对最小关键字大小把控,下面来推到B最大高度: 总结: 由一和二可知,通过寻找B两种极限存在,推出B高度范围为:logm(n+1)<= h <=log(ceil(m/2

    3.2K10

    数据结构之:二分搜索

    树结构有很多中,常见有: 二分搜索 线段 Trie B+ AVL 红黑 ---- 二分搜索基础 在介绍二分搜索之前我们先来看二叉,二叉是最基本树形结构,二叉由一个根节点和多个子节点组成...和链表一样也是动态数据结构: ? ? ? ? ? 二分搜索在二叉基础上增加了一些规则: ? ?...我们先来编写二分搜索树节点结构以及二分搜索基础属性和方法,代码如下: /** * @author 01 * @program Data-Structure * @description 二分搜索...:最短路径 ---- 删除二分搜索最大元素和最小元素 二分搜索删除操作是相对比较复杂,所以我们先来解决一个相对简单任务,就是删除二分搜索最大元素和最小元素。...由于二分搜索特性,其最小值就是最左边那个节点,而最大元素则是最右边那个节点。 以下面这棵二分搜索为例,看其最左和最右两个节点,就能知道最小元素是13,最大元素是42: ?

    38420

    【C++】AVLTree——高度平衡二叉搜索

    一、AVL概念 二叉搜索虽可以缩短查找效率,但如果数据有序或接近有序二叉搜索将退化为单支,查找元素相当于在顺序表中搜索元素,效率低下。...1(需要对结点进行调整),即可降低高度,从而减少平均搜索长度。...一棵AVL或者是空,或者是具有以下性质二叉搜索: 它左右子树都是AVL 左右子树高度之差(简称平衡因子)绝对值不超过1(-1/0/1) 平衡因子= 右子树高度-左子树高度 如果一棵二叉搜索高度平衡...AVL在二叉搜索基础上引入了平衡因子,因此AVL也可以看成是二叉搜索。...AVL是一棵绝对平衡二叉搜索,其要求每个节点左右子树高度绝对值都不超过1,这样可以保证查询时高效时间复杂度即log2( N) 。

    16430

    计算三叉搜索高度 - 华为OD机试题

    题目描述 定义构造三又搜索规则如下: 每个节点都存有一个数,当插入一个新数时,从根节点向下寻找,直到找到一个合适空节点插入查找规则是: 1.如果数小于节点数减去500,则将数插入节点左子树...2.如果数大于节点数加上500,则将数插入节点右子树 3.否则,将数插入节点中子树 给你一系列数,请按以上规则,按顺序将数插入中,构建出一棵三叉搜索,最后输出树高度。...输入描述 第一行为一个数N,表示有N个数,1<=N<=10000 第二行为N个空格分隔整数,每个数范围为[1,10000] 输出描述 输出树高度(根节点高度为1) 示例一 输入 5 5000 2000...5000 8000 1800 输出 3 说明 最终构造出如下,高度为3 。...示例二 输入 3 5000 4000 3000 输出 3 说明 最终构造出如下,高度为3 。 java题解 题解 模拟题 按题目要求规则直接构造, 然后递归方式获取高度即可。

    15110

    算法篇:高度

    算法: 这一类题目很简单,不过却是最基本操作之一,引申为判断是不是平衡二叉。 一般做法是,计算二叉左右子树高度+1,然后取它们最大值或者最小值。...左右两棵子树高度绝对值不超过1 // 备注:其中任意一个节点如果不满足平衡二叉时,那么这棵就不是平衡二叉了,此时我们可以直接返回flase func isBalanced(root *TreeNode...) bool { if root == nil { // nil表示是平衡二叉 return true } // 1.用来计算当前节点左右子树高度差是1...进一步判断右子树是不是平衡二叉 return isBalanced(root.Right) } // 典型计算二叉高度,当前左右子树最大高度+1 func maxDepth(root...= nil { // 对于一个孩子节点,要计算有孩子节点高度 h := minDepth(root.Left) if min > h { min

    67930

    Algorithms_二叉&二分搜索初探

    我们简明扼要整理下二叉,以及二分搜索特征及代码实现 ---- 二叉 ?...二叉不一定是“满” ---- 二分搜索 Binary Search Tree 特征 二分搜索是二叉,二叉特征全部适用于二分搜索 二分搜索每个节点值 大于其左子树所有节点值...每一棵子树也是二分搜索 比如下面的二分搜索 ? ---- 限制(存储元素必须具有可比性) 为什么要这么设计呢?...其实是为了特定场景,我们使用二分搜索查询数据的话,这两个数可以比较的话,那么就可以明确知道这个数据在左边还是在右边了,查询效率高。 所以什么样数据存到二分搜索中才能搜索呢?...root = add(root, e); } /** * * * @Title: add 内部调用 私有 递归函数 * * @Description: 返回插入新节点后二分搜索

    34410

    动画 | 什么是二分搜索(二叉查找)?

    二分搜索属性 ? 二分搜索又名比较多,有的叫二叉排序,也有的叫二叉查找,或者有序二叉查找。...如果不考虑升序,后序遍历也能够为二分搜索早点释放内存,早点减少栈使用空间。 Code ?...回到删除有左右子树元素,想想它左右子树也属于二叉排序(也是二分搜索),它左子树最大值比它小,它右子树最小值比它大。...所以不管选择左子树最大值还是选择右子树最小值,替换掉要删除元素,整个二叉都是符合二分搜索规则。...支持重复元素二分搜索 二分搜索有一个规则是:没有键值相等节点。那么就不建议把待添加元素跳过值相等节点,到下一步继续比较直到插入新节点。

    1.1K10

    数据结构与算法-二分搜索

    引言 二分搜索是一种特殊二叉,它具有独特性质,使得在中查找、插入和删除元素变得非常高效。本文将深入探讨二分搜索基本原理、实现步骤,并通过具体案例代码详细说明二分搜索每一个细节。...一、二分搜索基本概念 二分搜索是一种满足以下条件二叉: 左子树:每个节点左子树中所有节点值都小于该节点值。 右子树:每个节点右子树中所有节点值都大于该节点值。...唯一性:中不允许存在重复键值。 二、二分搜索操作 二分搜索支持以下主要操作: 插入节点:将一个新节点插入到中适当位置。 查找节点:在中查找具有给定键值节点。...删除节点:从中删除一个节点。 遍历:按某种顺序遍历所有节点。 三、二分搜索实现 接下来,我们将通过一个示例来详细了解二分搜索实现步骤。 1....二分搜索类 定义二分搜索类,实现主要操作: class BinarySearchTree: def __init__(self): self.root = None

    11410

    数据结构与算法-二分搜索遍历

    引言 二分搜索是一种特殊二叉,其中每个节点值都大于其左子树中所有节点值,且小于其右子树中所有节点值。这种特性使得在二分搜索中查找、插入和删除节点变得非常高效。...本文将深入探讨二分搜索遍历基本原理,并通过具体Java代码详细说明在二分搜索中进行遍历实现步骤。...一、二分搜索基本概念 二分搜索是一种特殊二叉,具有以下特性: 左子树:每个节点左子树中所有节点值都小于该节点值。 右子树:每个节点右子树中所有节点值都大于该节点值。...二、二分搜索遍历类型 二分搜索支持以下几种主要遍历方式: 前序遍历:访问节点 -> 遍历左子树 -> 遍历右子树 中序遍历:遍历左子树 -> 访问节点 -> 遍历右子树 后序遍历:遍历左子树 -...> 遍历右子树 -> 访问节点 三、二分搜索遍历实现 接下来,我们将通过一个示例来详细了解二分搜索遍历实现步骤。

    8310

    数据结构之AVL

    平衡和AVL 我们先来回忆一下二分搜索所存在一个问题:当我们按顺序往二分搜索添加元素时,那么二分搜索可能就会退化成链表。例如,现在有这样一颗二分搜索: ?...这是因为二分搜索不具有自平衡特性,为了让二分搜索不退化成链表,我们就得设计一种机制,即便是在按顺序添加元素时,也能让二分搜索维持平衡。而具有自平衡特性二叉或 m 叉,就称之为平衡。...Landis 首字母,AVL 在他们1962年论文中首次提出。所以,可以认为 AVL 是最早自平衡二分搜索树结构。AVL 遵循高度平衡,任意节点左右子树高度相差不超过 1。...---- 计算节点高度和平衡因子 经过以上介绍,现在我们已经知道了AVL是一种平衡二分搜索。那么为了维持AVL平衡,我们就得做一些额外工作。...除此之外,由于AVL本质上是一棵平衡版二分搜索,所以我们还需要检查AVL二分搜索性质。因为,调整AVL过程中可能会破坏二分搜索性质,此时就需要将其“矫正”过来。

    48210

    数据结构与算法-二分搜索链表节点插入

    本文将深入探讨节点插入基本原理,并通过具体Java代码详细说明在链表和二分搜索中插入节点实现步骤。 一、链表中节点插入 链表是一种线性数据结构,每个节点包含数据和指向下一个节点指针。...二分搜索是一种特殊二叉,其中每个节点值都大于其左子树中所有节点值,且小于其右子树中所有节点值。...二分搜索节点插入需要维护这个特性。 1....二分搜索类 定义二分搜索类,实现节点插入: public class BinarySearchTree { private TreeNode root; public void...bst.inorderTraversal(); } } 总结 无论是链表还是二分搜索,节点插入都需要遵循一定规则以确保数据结构正确性和效率。

    7910

    懵逼树上懵逼果:学习二分搜索

    懵逼二叉 懵逼树上懵逼果, 懵逼树下你和我。 一人一颗懵逼果, 一起学二分搜索。 数组、栈、队列、链表都是线性结构,则是另外一种极其重要数据结构。...种类有很多种,我们先从简单 二分搜索 开始学习。 二分查找法 二分查找法定义 是一种在有序数组中查找某一特定元素搜索算法。...这种搜索算法每一次比较都使搜索范围缩小一半。 动画演示 ? 动画说明 注意:二分查找前提是数列必须是有序。...置灰删除掉 检查剩余有序数列中心数字,这时是 5 找到了这个数字 二叉查找(Binary Search Tree)基础 二叉查找也可叫做二分查找。...因此二叉查找就需要进行改进为平衡二叉,比较常见 Balanced Binary Tree有: 红黑 tree AVL tree Splay tree Treap 二分搜索遍历 遍历(Traversal

    74910

    二分搜索BinarySearch来龙去脉

    二分搜索BinarySearch “来龙去脉” 二分搜索用于检索某个key是否在已排好序序列中,我们还记得上编程语言基础课程:猜字游戏吗?...因为这个笨拙游戏规则只会告诉你是对还是错误!!!...第二版游戏相比第一版增加了游戏提示,这个提示有利于用户缩小下一次猜想数字大概范围。 我们二分搜索就可以认为来自这个猜想,思路是: 在有序数组中查找关匹配键字元素。...如果中间索引值arr[mid] < key,则表名key在中间索引右边,猜数字比较小,需要往大方向猜。...package org.byron4j.dsaa.basic; /** * 二分检索--用于检索已排好序序列 * @author BYRON.Y.Y * */ public class BinarySerach

    14820

    数据结构与算法-二分搜索层序遍历

    引言 二分搜索是一种特殊二叉,其中每个节点值都大于其左子树中所有节点值,且小于其右子树中所有节点值。...本文将深入探讨二分搜索层序遍历基本原理,并通过具体Java代码详细说明在二分搜索中进行层序遍历实现步骤。...一、二分搜索基本概念 二分搜索是一种特殊二叉,具有以下特性: 左子树:每个节点左子树中所有节点值都小于该节点值。 右子树:每个节点右子树中所有节点值都大于该节点值。...唯一性:中不允许存在重复键值。 二、二分搜索层序遍历步骤 层序遍历通常按照以下步骤进行: 初始化队列:创建一个队列,并将根节点加入队列。...遍历队列:从队列中取出节点,访问节点值,并将左右子节点加入队列。 重复步骤2:直到队列为空。 三、二分搜索层序遍历实现 接下来,我们将通过一个示例来详细了解二分搜索层序遍历实现步骤。

    9110

    数据结构 | 二分搜索及它各种操作(kotlin实现)

    什么是二分搜索(Binary Search Tree)?...二分搜索是二叉二分搜索每个节点值大于其左子树所有节点值,小于其右子树所有节点值,简称 左小右大; 每一颗字数也是二分搜索; 存储元素必须有可比较性; 二叉遍历 前序遍历...二叉删除 /** * 删除以node 为根二分搜索 值为e节点 * 返回 删除节点后新二分搜索根 * */ private fun remove...node.right = null return nodeSuccess } } } 二分搜索层序遍历...,详情请查看 Github-重学数据结构-二分搜索 前,中,后序遍历 寻找中最小元素,最大元素 寻找中最小元素节点,最大元素节点 二分搜索删除最小值,最大值所在节点,并返回最小值,最大值 参考视频

    20130
    领券