高级树、AVL 树和红黑树

高级树、AVL 树和红黑树

二叉树遍历 Pre-order/In-order/Post-orde

  1. 前序(Pre-order):根-左-右
  2. 中序(In-order):左-根-右
  3. 后序(Post-order):左-右-根

示例代码

def preorder(self, root):
   if root:
        self .traverse_path.append(root.val)
        self .preorder(root.left)
        self .preorder(root.right) 

def inorder(self, root):
    if root:
        self .inorder(root.left)
        self .traverse_path.append(root.val)
        self .inorder(root.right)

def postorder(self, root):
    if root:
        self .postorder(root.left)
        self .postorder(root.right)
        self .traverse_path.append(root.val)

二叉搜索树 Binary Search Tree

二叉搜索树,也称二叉搜索树、有序二叉树(Ordered Binary Tree)、 排序二叉树(Sorted Binary Tree),是指一棵空树或者具有下列性质的 二叉树:

  1. 左子树上所有结点的值均小于它的根结点的值;
  2. 右子树上所有结点的值均大于它的根结点的值;
  3. 以此类推:左、右子树也分别为二叉查找树。 (这就是 重复性!)

中序遍历:升序排列

保证性能的关键

  1. 保证二维维度! —> 左右子树结点平衡(recursively)
  2. Balanced
  3. https://en.wikipedia.org/wiki/Selfbalancing_binary_search_tree

AVL树

  1. 发明者 G. M. Adelson-Velsky 和 Evgenii Landis
  2. Balance Factor(平衡因子): 是它的左子树的高度减去它的右子树的高度(有时相反)。 balance factor = {-1, 0, 1}
  3. 通过旋转操作来进行平衡(四种)
  4. https://en.wikipedia.org/wiki/Selfbalancing_binary_search_tree

旋转操作

  1. 左旋
  2. 右旋
  3. 左右旋
  4. 右左旋

子树形态:右右子树 —> 左

子树形态:左左子树 —> 右旋

子树形态:左右子树 —> 左右旋

子树形态:右左子树 —> 右左

总结

  1. 平衡二叉搜索树
  2. 每个结点存 balance factor = {-1, 0, 1}
  3. 四种旋转操作

不足:结点需要存储额外信息、且调整次数频繁

Red-black Tree

红黑树是一种近似平衡的二叉搜索树(Binary Search Tree),它能够确保任何一 个结点的左右子树的高度差小于两倍。具体来说,红黑树是满足如下条件的二叉搜 索树:

  • 每个结点要么是红色,要么是黑色
  • 根节点是黑色
  • 每个叶节点(NIL节点,空节点)是黑色的。
  • 不能有相邻接的两个红色节点
  • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

Red-black Tree

关键性质

从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。

对比

  • AVL trees provide?faster lookups?than Red Black Trees because they are more strictly balanced.
  • Red Black Trees provide?faster insertion and removal?operations than AVL trees as fewer rotations are done due to relatively relaxed balancing.
  • AVL trees store?balance factors or heights?with each node, thus requires storage for an integer per node whereas Red Black Tree requires only 1 bit of information per node.
  • Red Black Trees are used in most of the language libraries like?map,?multimap,?multisetin C++ whereas AVL trees are used in?databases?where faster retrievals are required.

原文地址:https://www.cnblogs.com/liugangjiayou/p/12590277.html

时间: 2024-10-12 03:40:20

高级树、AVL 树和红黑树的相关文章

《数据结构与算法分析:C语言描述》复习——第四章“树”——AVL树

2014.06.15 16:22 简介: AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母.此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1.有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别.没有bad case是AVL树与普通的二叉搜索树的最大区别.为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况.为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双

红黑树/B+树/AVL树

RB Tree 红黑树  :http://blog.csdn.net/very_2/article/details/5722682 AVL Tree    :http://blog.csdn.net/collonn/article/details/20128205 B[+/-] Tree  :http://hxraid.iteye.com/blog/611105 几种Tree 总结对比 :http://www.iteye.com/topic/614070 [nginx模块开发与架构解析]

平衡二叉树(AVL)与红黑树

一.AVL树性质 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树). AVL树的查找.插入和删除在平均和最坏情况下都是O(logn).如果在AVL树中插入或删除节点后,使得高度之差大于1.此时,AVL树的平衡状态就被破坏,它就不再是一棵二叉树:为了让它重新维持在一个平衡状态,就需要对其进行旋转处理. 二.红黑树性质 红黑树是每个节点都带有颜色属性的二叉查找树

树 -- AVL树

前言 通过之前对二叉查找树的讨论,我们知道在给定节点数目的情况下,二叉树的高度越低,查找所用时间也就越短. 在讨论红黑树的时候,我们说过红黑树并非完全"平衡"的二叉树,只是近似"平衡".那么这个平衡到底指的是什么呢?有没有完全"平衡"的二叉树? 平衡二叉树 什么样的二叉树能被形容为平衡二叉树呢? 1)空树 2)根的左右子树的高度之差的绝对值不超过1,并且左右子树也都是一棵平衡二叉树. 这样的树就被我们认作时平衡二叉树. 显然,当一颗二叉搜索树能够

04-树4. Root of AVL Tree-平衡查找树AVL树的实现

对于一棵普通的二叉查找树而言,在进行多次的插入或删除后,容易让树失去平衡,导致树的深度不是O(logN),而接近O(N),这样将大大减少对树的查找效率.一种解决办法就是要有一个称为平衡的附加的结构条件:任何节点的深度均不得过深.有一种最古老的平衡查找树,即AVL树. AVL树是带有平衡条件的二叉查找树.平衡条件是每个节点的左子树和右子树的高度最多差1的二叉查找树(空树的高度定义为-1).相比于普通的二叉树,AVL树的节点需要增加一个变量保存节点高度.AVL树的节点声明如下: typedef st

AVL树,红黑树,B-B+树,Trie树原理和应用

前言:本文章来源于我在知乎上回答的一个问题 AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中? 看完后您可能会了解到这些数据结构大致的原理及为什么用在这些场景,文章并不涉及具体操作(如插入删除等等) 目录 AVL树 AVL树原理与应用 红黑树 红黑树原理与应用 B/B+树 B/B+树原理与应用 Trie树 Trie树原理与应用 AVL树 简介: AVL树是最早的自平衡二叉树,在早期应用还相对来说比较广,后期由于旋转次数过多而被红黑树等结构取代(二者都是用来搜索的),AVL树内

Linux内核之于红黑树and AVL树

为什么Linux早先使用AVL树而后来倾向于红黑树?       实际上这是由红黑树的实用主义特质导致的结果,本短文依然是形而上的观点.红黑树可以直接由2-3树导出,我们可以不再提红黑树,而只提2-3树,因为 2-3树的操作太简单.另外,任何红黑树的操作和特性都可以映射到2-3树中.因此红黑树和AVL树的比较就成了2-3树和AVL树的比较. 它们俩的区别在哪?2-3树的平衡是完美平衡的,但是树杈数量却可以是3个,而AVL树差一点点就完美平衡的标准二叉树,它只允许子树的高度差最多为1. 可见这么看

红黑树和AVL树的实现与比较-----算法导论

一.问题描述 实现3种树中的两种:红黑树,AVL树,Treap树 二.算法原理 (1)红黑树 红黑树是一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是red或black.红黑树满足以下五个性质: 1) 每个结点或是红色或是黑色 2) 根结点是黑色 3) 每个叶结点是黑的 4)如果一个结点是红的,则它的两个儿子均是黑色 5) 每个结点到其子孙结点的所有路径上包含相同数目的黑色结点 本实验主要实现红黑树的初始化,插入和删除操作.当对红黑树进行插入和 删除操作时,可能会破坏红黑树的五

浅谈AVL树,红黑树,B树,B+树原理及应用

背景:这几天在看<高性能Mysql>,在看到创建高性能的索引,书上说mysql的存储引擎InnoDB采用的索引类型是B+Tree,那么,大家有没有产生这样一个疑问,对于数据索引,为什么要使用B+Tree这种数据结构,和其它树相比,它能体现的优点在哪里? 看完这篇文章你就会了解到这些数据结构的原理以及它们各自的应用场景. 二叉查找树 简介 二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质: 任意节点左子树不为空,则左子树的值均小于根节点的值. 任意节点右子树不为

【算法导论学习-26】 二叉树专题4:红黑树、AVL树、B-Tree

1.   红黑树(Red-Black Trees) 参考<算法导论>P308页,红黑树是一种对树的高度要求最灵活的准平衡二叉搜索树.五大属性: 1: Every node is either RED or BLACK. 2: The root is black. 3: Every leaf(NIL) is black.  (The NIL is the sentinel.) 4: If a node is RED, then both its children areblack. 5: For