BST AVL RBT

2024-04-21 13:18
文章标签 avl bst rbt

本文主要是介绍BST AVL RBT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

BST

BST

定义
  • 根节点的值大于左子树包含的节点的值
  • 根节点的值小于右子树包含的节点的值
  • 左右子树都是BST
插入

假设当前节点为 cur ,待插入节点为 node ,根节点为 root ,分如下四种情况:

  1. root == None: root=node
  2. cur.val == node.val: 不做任何处理
  3. cur.val > node.val:
    • if cur.left == None: cur.left = node
    • if cur.left != None: 递归左子树
  4. cur.val < node.val:
    • if cur.right == None: cur.right = node
    • if cur.right != None: 递归右子树
删除

分如下三种情况:

  1. 删除节点为叶子节点:直接删除
  2. 删除节点只有一个子节点:删除节点的父节点指向其唯一的那个子节点
  3. 删除节点有两个子节点:选择后继节点(右子树的最小节点)来顶替其位置,然后删除后继节点

AVL

AVL

平衡因子:树中某结点其左子树的高度和右子树的高度之差

定义
  • 特殊的BST,树中任意一个节点的平衡因子绝对值小于等于1

AVL的插入和删除时间复杂度均为 O ( l o g 2 n ) O(log_2 n) O(log2n) n n n 为树中节点个数。

AVL树大部分操作都和BST树相同, 只有在插入删除结点时, 有可能造成AVL树失去平衡, 而且只有那些在被插入/删除结点到根节点的路径上的结点有可能出现失衡, 因为只有那些结点的子树结构发生了变化

这时我们需要一些操作来把树恢复平衡,这些操作叫做AVL树的旋转:

  • LL
  • RR
  • LR
  • RL

具体操作可见 平衡二叉树(AVL树)的平衡原理以及插入,删除操作 和 AVL树的插入和删除

插入
  • 当插入新结点导致不平衡时, 我们需要找到距离新节点最近的不平衡结点为轴来转动AVL树来达到平衡
删除
  • AVL删除节点的操作与和BST一样, 不同的是删除一个结点有可能引起父结点失衡。与插入不同,除了在父节点处旋转外,可能必须在父节点的祖先处再进行旋转。因此,我们必须继续追踪路径,直到到达根为止。

RBT

RBT

  • 一棵含有 n n n 个节点的红黑树的高度至多为 2 l o g ( n + 1 ) 2log(n+1) 2log(n+1)
  • RBT的插入和删除时间复杂度均为 O ( l o g 2 n ) O(log_2 n) O(log2n) n n n 为树中节点个数
定义

RBT也是一种特殊的BST,此外它还有如下五个特性:

  1. 每个节点要么黑色,要么红色
  2. 根节点为黑色
  3. 每个叶子节点为黑色(这里叶子节点专指值为None的节点)
  4. 如果一个节点为红色,那么它的子节点必为黑色
  5. 任意一节点到每个叶子节点的路径上都包含相同数量的黑色节点
插入、删除

RBT的插入和删除情况较为复杂,具体案例可见 什么是红黑树?面试必问! 和 红黑树(一)之 原理和算法详细介绍

RBT相比于BST、AVL有什么优缺点

  • RBT是牺牲了严格的高度平衡的优越条件为代价,它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。红黑树能够以 O ( l o g 2 n ) O(log_2 n) O(log2n) 的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。

  • 相比于BST,因为红黑树可以能确保树的最长路径不大于两倍的最短路径的长度,所以可以看出它的查找效果是有最低保证的。在最坏的情况下也可以保证 O ( l o g n ) O(logn) O(logn) 的,这是要好于二叉查找树的。因为二叉查找树最坏情况可以让查找达到 O ( n ) O(n) O(n)

  • RBT的算法时间复杂度和AVL相同,但统计性能比AVL更高。AVL在插入和删除中所做的后期维护操作会比RBT要耗时好多,但是他们的查找效率都是 O ( l o g n ) O(logn) O(logn) ,所以RBT应用还是高于AVL的。实际上插入AVL和RBT的速度取决于你所插入的数据。如果你的数据分布较好,则比较宜于采用AVL(例如随机产生系列数),但是如果你想处理比较杂乱的情况,则RBT是比较快的。


参考自

  • BST(二叉搜索树)
  • 平衡二叉树(AVL树)的平衡原理以及插入,删除操作
  • 详细图文——AVL树
  • AVL树的插入和删除
  • 什么是红黑树?面试必问!
  • 红黑树(一)之 原理和算法详细介绍
  • 面试题——轻松搞定面试中的红黑树问题

这篇关于BST AVL RBT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923175

相关文章

AVL 树的旋转

什么是 AVL 树? AVL 树是一种自平衡二叉搜索树(Binary Search Tree, BST),以其发明者 G. M. Adelson-Velsky 和 E. M. Landis 的名字命名。它的特点是对于任意一个节点,其左右子树的高度差(平衡因子)不超过 1,这确保了 AVL 树的高度在 O(log n) 的范围内,从而保证了插入、删除和查找操作的时间复杂度都是 O(log n)。

深入理解二叉搜索树(BST)

一棵二叉搜索树(BST)是以一棵二叉树来组织的,可以用链表数据结构来表示,其中,每一个结点就是一个对象,一般地,包含数据内容key和指向孩子(也可能是父母)的指针属性。如果某个孩子结点不存在,其指针属性值为空(NIL)。 二叉搜索树中的关键字key的存储方式总是满足二叉搜索树的性质: 设x是二叉搜索树中的一个结点。如果y是x左子树中的一个结点,那么会有y.key<=x.key;如果y是x右子树

【C++】【数据结构】一步一步写平衡二叉树[AVL]

转载:有修正,原作者存在一些错误,这里进行了更正。/* 平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体第一个引入平衡概念的二叉树。特点:对于每一个结点,它的左右子树的高度之差不能超过1,若插入或删除一个节点之后使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。这个方案很好的解决的了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度

Add, Search, Delete Node in BST.

Add Node, Search Node, Delete Node, 的基本操作,被问了两次了。写出来。 http://quiz.geeksforgeeks.org/binary-search-tree-set-1-search-and-insertion/   // add the node;public TreeNode addNode(TreeNode root, int val)

C++深入理解AVL树的设计与实现:旋转操作详解

C++深入理解AVL树的设计与实现:旋转操作详解 AVL树(Adelson-Velsky and Landis Tree)是一种自平衡二叉搜索树,通过在插入和删除节点时进行旋转操作来保持树的平衡。AVL树的每个节点都维护一个平衡因子,即左右子树的高度差,确保其绝对值不超过1。本文将详细介绍如何实现一个AVL树,并提供旋转操作的实现细节。 一、AVL树的基本概念 AVL树是一种高度平衡的二叉搜

AVL树及其性质

概念 AVL树是一种自平衡二叉搜索树,由G.M. Adelson-Velsky和E.M. Landis在1962年提出。AVL树的特点是任何节点的两个子树的高度最多相差1,这个特性保证了树的平衡,从而保证了树的主要操作(如插入、删除和查找)的时间复杂度为O(log n)。 AVL树的主要性质 平衡因子: 每个节点都有一个平衡因子,定义为右子树高度减去左子树高度。在AVL树中,每个节点的平衡

AVL 树的实现与应用

目录 引言AVL 树简介AVL 树的性质AVL 树的旋转 右单旋 (RR)左单旋 (LL)右左双旋 (RL)左右双旋 (LR)AVL 树的实现 AVL 树节点AVL 树类 插入删除旋转验证代码示例性能考量总结参考文献 引言 在计算机科学中,AVL 树是一种自平衡的二叉搜索树。它由 Adelson-Velsky 和 Landis 在 1962 年提出,以他们的名字首字母命名。AVL 树

BST二叉搜索树的几个操作

Binary Srearch Tree:二叉排序树、二叉搜索树(重点在search) (一)用BST进行查找 代码1:用BST进行查找(递归版本):思路与二分查找很像 //使用BST查找:递归版本BSTNode * BST_Search(BiTree T,ElemType key){if(T==nullptr) return ;if(key==T->root){return T->root

为什么AVL fire DVI 界面里面的response Editor project 中的Summary result 点不了???

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 问题描述   为什么AVL fire DVI 界面里面的response Editor project 中的Summary result 点不了??

深入理解二叉搜索树(BST)与节点查找:递归与迭代的多角度分析

深入理解二叉搜索树(BST)与节点查找:递归与迭代的多角度分析 二叉搜索树(BST) 是计算机科学中一种常见的数据结构,它通过在二叉树的基础上增加有序性约束,使得查找、插入和删除操作能够在平均情况下达到 O(log n) 的时间复杂度。因此,BST 被广泛应用于各种需要高效查找的数据结构中,如符号表、优先队列等。 本文将从基本概念出发,详细分析如何在 BST 中查找节点,并通过递归和迭代两种方