数据结构之2-3-4树

2-3-4树是一种阶为4的B树。它是一种自平衡的数据结构,可以在O(lgn)的时间内查找、插入和删除,这里的n是树中元素的数目。2-3-4树和红黑树是等价的,也就是每个红黑树都可以转化为一颗2-3-4树,每个选择操作也和2-3-4树中的分裂操作对应。

2-3-4树是这样一种数据结构,满足如下性质:

1) 每个节点每个节点有1、2或3个key,分别称为2-node,3-node,4-node。

2) 每个节点的keys把区间进行了划分,以4-nde为例,key1、key2、key3分别夹在subtree1, subtree2和subtree2, subtree3和subtree3, subtree4之间。

3) 4-node的子节点不能是4-node。

如下图所示:

      搜索:

1. 从root开始

2. 比较当前节点的值

2.1 如果找到,就返回当前节点

2.2 如果没有找到,就找出要搜索的值属于哪一个子树

3. 递归的搜索子树

      在插入和删除的关键是维持性质3),即4-node的节点不能是4-node

     插入Key

     1.递归搜索Key

1.1 如果root是4-node(ABC),则建一个新的root(B),A,C成为它的两个子树

     1.2 向下搜索, 对于中途经过的每一个node, 如果它是4-node则使用如下图的变换分拆(注意到根据假设算法不会产生4-node的子节点是4-node, 所以这个操作总是能进行的)

     1.3 如果相应的key已存在, 则算法结束, 不需要插入

2. 注意到如果key不存在, 则1的递归搜索一定停在叶节点

3. 在当前的叶节点插入

     3.1 如果是2-node或3-node, 则插入当前节点把它变成3-node或4-node, 算法结束

     3.2 如果是4-node, 则根据假设, 它的父节点一定不是4-node(即是2-node或者3-node)

       3.2.1 使用与1.2相同的变换分拆4-node

       3.2.2 插入相应节点(如图所示, 一定是2-node)

要证明2-3-4上面的出入算法一定形成一个平衡树,即从root开始往下到任一个叶子的长度都是相等。

用数学归纳法:

1. 只有一个节点的树当然是平衡的

2. 假设插入了n个元素,树还是平衡的,现在插入一个新元素,要证明不会破坏平衡性:

算法会改变tree的是1.1, 1.2, 3.1, 3.2。显然1.2, 3.1, 3.2都不会改变树的深度,考虑1.1,它令树的路径深度增加1,原来的树是平衡的,深度增加后当然还是平衡的。

有n个元素的2-3-4树的深度的粗略估计;最坏情况全是2-node,则深度是logn,最好情况全是4-node,深度为logn/2,故:

logn/2 <  depth  ≤  logn(左边括号是不可能的,因为不存在4-node的子节点是4-node)。

想详细了解代码实现,请移步http://www.cnblogs.com/guoyiqi/archive/2011/06/08/2129310.html。我这里只提一些概念性的东西

时间: 2024-11-16 02:13:20

数据结构之2-3-4树的相关文章

34. 蛤蟆的数据结构笔记之三十四树的概念

34. 蛤蟆的数据结构笔记之三十四树的概念 本篇名言:"过去属于死神,未来属于你自己.--雪莱" 本篇笔记开始我们要进入新的概念了,树!是不是有点小激动呢?让我们从概念开始吧 当然概念要理解,如果当前不能立刻理解,可以后续结合代码一起理解效果更佳. 1.  树型结构 之前我们学习的那么多,其实都是线性数据结构. 树 则不同,它是非线性结构. 树形结构指的是数据元素之间存在着"一对多"的树形关系的数据结构,是一类重要的非线性数据结构.在树形结构中,树根结点没有前驱结点

python数据结构与算法 38 分析树

分析树 树的结构完成以后,该是时候看看它能做点什么实事儿了.这一节里,我们研究一下分析树.分析树能够用于真实世界的结构表示,象语法或数学表达式一类的. 图1 一个简单语句的分析树 图1所示是一个简单语句的层级结构,把语句表示为树结构可以让我们用子树来分析句子的组成部分. 图2 ((7+3)?(5?2))的分析树 我们也可以把数学表达式如((7+3)?(5?2))表示为分析树,如图2.此前我们研究过完全括号表达式,这个表达式表达了什么呢?我们知道乘法的优先级比加减要高,但因为括号的关系,在做乘法之

数据结构例程——哈夫曼树

本文是数据结构基础系列(6):树和二叉树中第15课时哈夫曼树的例程. #include <stdio.h> #include <string.h> #define N 50 //叶子结点数 #define M 2*N-1 //树中结点总数 //哈夫曼树的节点结构类型 typedef struct { char data; //结点值 double weight; //权重 int parent; //双亲结点 int lchild; //左孩子结点 int rchild; //右孩

20172328《程序设计与数据结构》实验二:树

20172328<程序设计与数据结构>实验二:树 课程:<软件结构与数据结构> 班级: 1723 姓名: 李馨雨 学号:20172328 实验教师:王志强老师 实验日期:2018年11月5日-2018年11月12日 必修选修: 必修 一.实验要求内容 实验1:实现二叉树 参考教材p212,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder) 用JUnit或自己编写驱动类对自己实现的LinkedB

20172303 2018-2019-1《程序设计与数据结构》哈夫曼树编码与解码

20172303 2018-2019-1<程序设计与数据结构>哈夫曼树编码与解码 哈夫曼树简介 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 带权路径长度(Weighted Path Length of Tree,简记为WPL) 结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数. 结点的带权路径长度:结点到树根之间的路径长度与

一步一步写数据结构(BST-二叉排序树)

二叉排序树的重要性不用多说,下面用c++实现二叉排序树的建立,插入,查找,修改,和删除.难点在于删除,其他几个相对比较简单. 以下是代码: 1 #include<iostream> 2 using namespace std; 3 //定义节点 4 typedef struct BiNode 5 { 6 int data; 7 struct BiNode *lchild,*rchild; 8 }BiNode,*BiTree; 9 10 //插入函数 11 void insertBST(BiTr

算法系列笔记5(扩展数据结构-动态顺序统计和区间树)

在编程中,我们往往使用已有的数据结构无法解决问题,这是不必要急着创建新的数据结构,而是在已有数据结构的基础上添加新的字段.本节在上一次笔记红黑树这一基础数据结构上进行扩展,得出两个重要的应用-动态顺序统计和区间树. 动态顺序统计 在算法系列笔记2中我们在线性时间内完成了静态表的顺序统计,而这里我们在红黑树上进行扩展,在O(lgn)时间内完成该操作,主要包括返回第i 排名的元素os_select(i)和给定一个元素x,返回其排名(os_rank(x)). 思想:添加新项:在红黑树的结点上记录下该结

【数据结构和算法】:树和二叉树定义、基本术语和性质

树的定义和基本术语 ?树:是一类重要的非线性数据结构,是以分支关系定义的层次结构. ?根:树(tree)是n(n>=0)个结点的有限集T,对于非空树,其中有且仅有一个特定的结点,称为树的根(root). ?子树:当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,--Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree).每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继. 结点:包含一个数据元素及若干指向子树的分支. 结点的度:结点子树的个数.

数据结构--图(中)--树之习题选讲Complete Binary Search Tree

Complete Binary Search Tree 完全 二叉 搜索数 题意理解 二叉搜索数 左小右大 完全二叉树 结构规律 完全二叉搜索数 到底用什么数据结构来表示这个树呢?链表还是数组. 1.由于是完全二叉树,所以我们能准确的算出来左子树有多少个结点.   完全二叉树+n个树 -> 左子树的个数 2.左子树的个数能推出根节点的大小,左子树4个,那么根节点一定是第5位数 左子树的个数->根节点的值 3.这个思维:当我们确定了根节点之后,我们可以很容易的通过递归来确定其他的结点      

数据结构基础温故-4.树与二叉树(中)

在上一篇中,我们了解了树的基本概念以及二叉树的基本特点和代码实现,还用递归的方式对二叉树的三种遍历算法进行了代码实现.但是,由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多.而且,如果递归深度太大,可能系统撑不住.因此,我们使用非递归(这里主要是循环,循环方法比递归方法快, 因为循环避免了一系列函数调用和返回中所涉及到的参数传递和返回值的额外开销)来重新实现一遍各种遍历算法,再对二叉树的另外一种特殊的遍历—层次遍历进行实现,最后再了解一下特殊的二叉树—二叉查找树. 一.递归与循环的区别及