![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
naturerun
将编程视为一种乐趣,将代码作为一种艺术
展开
-
遍历递归树求递推数列通项
考虑K阶变系数线性递推方程:现给定初值a1,a2,—,ak和n>k,要求编程打印an,an-1,—,ak+1的值该问题用常规的迭代法非常容易解决,现在要考虑的是用遍历递归调用树的方法求解。n=7,k=3时,递归调用树为package programm; //遍历递归树中所有节点,相同值会重复计算import java.util.*;public class RecursionTree { public static void ..原创 2021-12-19 18:53:04 · 350 阅读 · 0 评论 -
多叉树的运算
以以下4叉树为例(K=4)结点旁的数字代表结点数据域中存放的值,ROOT表示根结点,根结点数据域为0问题:求K叉树叶子结点的数目和深度解答(C语言):#include <iostream>#include <vector>#include <stdio.h>#include <malloc.h>#define K 4 //树的最大分叉数struct TreeNode //表示K叉树节点的结构体类型{ int.原创 2021-12-18 21:17:50 · 1009 阅读 · 0 评论 -
AA树实现
AA树为自平衡二叉搜索树,为红黑树的变体。每个AA树节点有该节点所在层数,相当于红黑树的黑高度,以及一个垂直左链指针和右链指针,右链指针可以为垂直也可以为水平,不允许出现两个连续的右链指针。以下AA树实现为笔者自己设计,笔者没有看懂数据结构与算法分析Java语言描述第二版中对AA树skew和split操作的介绍,于是干脆自行设计插入删除算法,C++代码如下:#include <iostream>#include <stack>#include <vector>原创 2021-12-18 18:27:52 · 1057 阅读 · 0 评论 -
确定性跳跃表(1-2-3跳跃表(SkipList))实现
所谓1-2-3跳跃表是指跳跃表每一个链接层中两个相邻链接指针,之间的下一层节点数只能是1,2或3.它是一种特殊的跳跃表,其操作的时间复杂度可以达到实现C++代码如下,分为两个版本,第一版本中每个节点的所有链接指针用vector容器组织,第二个版本中每个节点的链接指针用list容器组织第一个版本:#include <iostream>#include <vector>#include <deque>#include <set>#includ原创 2021-12-18 18:11:30 · 282 阅读 · 0 评论 -
构造N个节点的所有HB(k)树(广义AVL树)实现
回顾一下HB(k)树的定义:HB(k)树要么是空树要么是满足如下条件的二叉搜索树:其左右子树均为HB(k)树,且右子树高度和左子树高度差的绝对值小于等于k.现在给定从小到大排序的N个关键码,现要构造出这些关键码对应的所有HB(k)树,算法如下(C++实现)#include <iostream>#include <vector>#include <utility>#include <algorithm>#include <memo原创 2021-12-17 21:28:40 · 393 阅读 · 0 评论 -
带附加头节点的广义表运算c++源码分享
之前文章里给出的基于广义表链表表示的运算中用链表表示的广义表除广义表本身外的其他所有子表都是没有附加头节点的,即utype==1的节点(在同一层子表中表示为该子表的子表的表元素)的hlink指针直接指向下一层子表的表头,而不是附加头节点,这是一个疏忽。所以我把所有适用于广义表没有附加头节点的链表表示的相关运算的c++实现进行了修改,修改后的源码可以适用于有附加头节点的情形,完成的功能保持不变。找出所有子表及相关属性#include "stdafx.h"#include <iostream&原创 2021-12-06 21:48:10 · 891 阅读 · 0 评论 -
根据广义表建立对应二叉树(子女兄弟链表表示)并由二叉树输出对应广义表(子女兄弟链表表示)的C++非递归算法
根据输入的广义表建立子女右兄弟链的二叉树表示,该二叉树对应于广义表对应的普通树。先考虑更复杂的情形,如果广义表中存在共享表,则将其转换为带共享子树的二叉树表示,每一共享子树带有附加头节点,其左链指针指向共享子树,最后输出带共享子树的子女右兄弟链表示(广义表形式)C++代码:#include "stdafx.h"#include <iostream>#include <stack>#include <string>#include <map>原创 2021-12-06 21:44:23 · 1029 阅读 · 0 评论 -
将二叉树(子女兄弟链表)调整为树然后将树转换为二叉树(直接修改) 非递归算法
将子女兄弟链表调整为普通树然后将普通树调整为子女兄弟链表,注意是在原树上直接进行调整,不是根据原树创建转换后的新树,为了操作方便,树指针域用vector表示C++代码:子女兄弟链表存在共享子树情形:#include "stdafx.h"#include <iostream>#include <stack>#include <vector>#include <string>#include <map>using namesp原创 2021-12-06 21:41:12 · 353 阅读 · 0 评论 -
字符串广义表和多叉树、普通树以及多叉树、普通树和广义表链表表示的相互转换(非共享表情形)
程序用string对象接受广义表字符串的输入并将其转换为多叉树,然后将该多叉树转换为字符串广义表输出#include "stdafx.h"#include <iostream>#include <string>#include <vector>using namespace std;class Knode //k叉树节点{public: char data; //节点数据域 Knode **p; //指向各子节点指针数组原创 2021-12-06 21:37:53 · 442 阅读 · 0 评论 -
多叉树和普通树的复制,删除和比较的非递归实现(深度优先遍历)
多叉树的复制很简单深度优先遍历要拷贝的树,要拷贝的树的遍历指针刚好比目标树拷贝指针快一步,这样就能实现要拷贝的树的子节点副本和拷入的目标树的父节点的连接代码:(所有运算均用c++实现) 程序接受广义表字符串输入,将其转化为多叉树,然后复制多叉树并转换为广义表输出#include "stdafx.h"#include <iostream>#include <vector>#include <string>using namespace std;c.原创 2021-12-06 21:34:47 · 807 阅读 · 0 评论 -
用非递归方法实现共享表运算
这里把无共享表的广义表的运算代码(基于附加头节点的链表表示)稍作修改,得到了基于附加头节点链表表示的共享表运算代码,这里就不详细注释了,可以参考之前发布的无共享表运算代码的注释来帮助理解,在共享表运算代码里映射表标准库类型map起到了重要作用广义表(包括共享表情形)字符串形式和链表表示的相互转换:#include "stdafx.h"#include <iostream>#include <string>#include <vector>#include原创 2021-12-06 21:24:00 · 213 阅读 · 0 评论 -
广义表链表表示的复制删除比较运算的非递归实现(c++)
广义表链表表示的删除:从广义表附加头节点开始,逐一分离表头元素,是原子项就直接删除,是子表附加头节点则暂不删除,直接进入子表,再分离表头元素,然后用相同的方法删除,子表删除完成后向上回溯,继续删除上一层子表,如此不断进行直到整个广义表被删除为止代码(C++)#include "stdafx.h"#include <iostream>#include <vector>#include<string>using namespace std;struc原创 2021-12-06 21:17:30 · 393 阅读 · 0 评论 -
广义表的非递归深度优先遍历及相关运算的c++实现
对广义表的链表表示的深度优先遍历的实现要点是,从广义表的附加头节点开始向后顺序访问,对原子节点,访问结束后递进至下一节点,每遇到子表的附加头节点就进入该子表所在的下一层继续向下遍历,在下一层的子表中同样也是访问并经过原子节点,一遇到子表附加头节点就立即向下进入子表继续遍历,就这样不断向下遍历,最终进入空表或没有子表的非空表并遍历完成后就立即回溯至上一层子表并按照上述规则继续向后遍历,子表遍历完成就再回溯至上上层子表,然后继续遍历,就这样反复不断地回溯和向下遍历,直到最后一次回溯至原广义表并向后完成遍历后整个原创 2021-12-06 21:08:24 · 701 阅读 · 0 评论 -
Patricia Tree(数字查找树)的实现
patricia tree是《数据结构(C语言版)》(美)Ellis Horowitz Sartaj Sahni Susan Anderson-Freed 著 中译本(李建中 张岩 李治军译) p351中介绍的一种改进版的数字查找树其插入删除操作实现如下(插入实现和书上示例代码有出入,删除算法为自己思考所得)#include <iostream>#include <vector>#include <stack>#include <random>原创 2021-12-05 21:19:11 · 1170 阅读 · 0 评论 -
二项队列实现
二项队列的详细介绍见数据结构与算法分析java语言描述第三版 Weiss著,这里只给出实现C++代码:#include <iostream>#include <vector>#include <set>#include <stack>using namespace std;template <typename T>struct BinomialQueueNode //二项队列节点{ T data; Binomial原创 2021-12-05 21:09:53 · 365 阅读 · 0 评论 -
左式堆(左高树)实现
左式堆是满足如下性质的二叉树(最小堆序):要么为空树,要么根节点的左右子树均为左式堆,且根节点的关键码值小于等于左右子树所有节点的关键码值,此外左子树代表的左式堆的零路径长度大于等于右子树代表的左式堆的零路径长度一个左式堆的零路径长度定义为:左式堆的根节点到达左式堆中任意至少有一个子女节点为空的节点的路径长度的最小值,如果左式堆为空,其零路径长度规定为-1,如果左式堆根节点至少有一个子女节点为空,则左式堆的零路径长度为0显然,由零路径长度的定义,当左式堆不为空时,它的零路径长度为根节点的左右子树原创 2021-12-05 20:37:01 · 340 阅读 · 0 评论 -
自顶向下伸展树实现
自顶向下伸展树的详细介绍见数据结构与算法分析java语言描述第三版 Weiss著,这里只给出实现以下代码囊括了伸展树自底向上和自顶向下的所有实现C++代码:#include <iostream>#include <stack>#include <vector>using namespace std;struct JudgeResult //对二叉树的判断结果{ bool isBST = true; //是否为二叉搜索树 int max_v原创 2021-12-05 20:29:57 · 253 阅读 · 0 评论 -
treap树的插入与删除
为避免普通的二叉搜索树在最坏情况下退化为单链表,引入了使二叉搜索树近似保持平衡的treap树,treap是一棵二叉搜索树,和普通的二叉搜索树不同的是,treap树每一个节点有一个附加的数据域pri,各节点的pri满足最大或最小堆序,treap树各节点按关键码组织为二叉搜索树,按pri数据域组织为最小堆或最大堆,只要在插入或删除时保证堆性质不被破坏,就能使二叉搜索树尽可能保持近似平衡,保证搜索效率,treap树就是二叉搜索树和堆合二为一的产物treap树删除:以最小堆序为例设被删节点为p,若p为叶原创 2021-12-05 20:12:18 · 420 阅读 · 0 评论 -
邻接多重表 操作实现
邻接多重表是一种比较重要的无向简单图存储结构,鉴于无向图在数据结构课程中的重要性,邻接表多重操作实现必须要予以解决。图论及其算法在编译原理中具有很重要的地位,图着色的寄存器分配就要用到无向简单图,所以自己尝试实现一下邻接多重表的操作。一开始很天真的以为邻接多重表的实现难度和十字链表应该相差不大,十字链表能够实现邻接多重表应该也不成问题,但实际开始动手后才发现情况并非如此,邻接多重表实现比十字链表更为复杂。不得不承认自己实在太笨,问题没考虑全面就急匆匆敲代码,结果运行后不是发现这里没考虑到就是那里存在错误原创 2021-12-05 19:53:38 · 835 阅读 · 0 评论 -
B+树的插入与删除
B+树删除(仅考虑阶数m>=3的情形,注意叶节点合并时需要修改叶节点顺序链表的链接指针,下文并未提到)删除仅在叶节点上进行,在叶节点上删除给定关键码后,如果叶节点为根节点则删除操作结束(此时删除后的B+树可能为空树).如果不为根节点且含有的关键码树>=ceil(m/2)[ceil表示向上取整]则删除操作结束,如果删除的是叶节点最右侧的关键码,还需用新的最右侧关键码沿叶节点至根节点的路径向上更新父节点指向叶节点,父节点的父节点-指向父节点—–的索引项,直到根节点的索引项被更新或被更新的索引项不原创 2021-12-05 19:47:16 · 2756 阅读 · 1 评论 -
B树的插入与删除
B树的删除(仅考虑阶数m>=3的情形)在非叶节点中删除关键码,只需从关键码右侧指针指向的子树中寻找最小关键码(沿最左侧指针向下走到叶节点,叶节点最左侧关键码即是)替换该关键码,并从最小关键码所在叶节点删除该最小关键码即可。这样只讨论在叶节点中删除关键码。在叶节点中删除给定关键码,先删去该关键码及其右侧空指针,然后若该叶节点为根节点,则删除操作结束(删除后的B树可能为空树),若该叶节点不为根节点且关键码数大于等于ceil(m/2)-1,则删除操作结束。若该叶节点不为根节点且关键码数等于ceil(原创 2021-12-05 19:39:17 · 1180 阅读 · 1 评论 -
van Emde Boas树实现
VanEmdeBoas树的详细介绍见算法导论第三版,这里只给出实现C++代码:#include <iostream>#include <memory>#include <vector>#include <deque>#include <stack>#include <random>#include <ctime>using namespace std;struct VanEmdeBoasTreeN原创 2021-12-03 23:35:22 · 390 阅读 · 1 评论 -
斐波那契堆实现
斐波那契堆这种高级数据结构在算法导论第三版中有非常详细的分析和介绍,这里不回顾斐波那契堆的基础知识,只给出个人的实现,想了解斐波那契堆请参看算法导论#include <iostream>#include <stack>#include <vector>#include <utility>#include <memory>#include <limits.h>using namespace std; //注意斐波那契堆原创 2021-12-03 23:33:11 · 734 阅读 · 1 评论 -
Patricia Trie(压缩Trie树)实现
patricia trie的实现要点是将度为一的连续分支节点压缩为一串字符串为索引的单一分支节点,从而达到节省空间的目的,是在普通Trie树上的改进第一种实现:分支节点用map容器#include <iostream>#include <map>#include <vector>#include <string>#include <stack>#include <random>using namespace st原创 2021-12-03 22:59:52 · 1092 阅读 · 0 评论 -
Trie树的实现
Trie树是保存字符串公共前缀信息的数据结构,可用于字符串多模匹配,普通的非压缩Trie树实现如下第一种实现:每个分支节点使用map标准库容器保存前缀索引#include <map>#include <stack>#include <vector>#include <string>#include <iostream>#include <random>using namespace std;enum Compa原创 2021-12-03 22:51:28 · 489 阅读 · 0 评论 -
HB(k)树(广义AVL树)的实现
HB(k)树是对AVL树的推广,故称广义AVL树,具体定义是HB(k)树要么是空树要么是满足如下条件的二叉搜索树:其左右子树均为HB(k)树,且右子树高度和左子树高度差的绝对值小于等于k.本文HB(k)树的删除算法参考了苏州大学唐自立老师的参考文献《一种新的删除HB(k)树的结点的算法》。笔者根据文中的当前阶段删除的示意图编写自底向上的删除算法,插入算法完全为自己独立思考所得,具体代码如下:#include <stack>#include <vector>#incl原创 2021-12-03 18:12:20 · 238 阅读 · 1 评论 -
红黑树和2-3-4树的相互转换
由于红黑树的每一处结构都能唯一的转换为2-3-4树(即4阶B树)中对应的结构因此每一棵红黑树都唯一对应一棵2-3-4树,但反之,对应于只有两个关键码的2-3-4树节点的2-3-4树结构能够转换为两种不同的红黑树结构(两个关键码左边为红黑树中黑色节点,右边为红色节点或相反),所以一般情况下对于一棵2-3-4树,往往有多棵红黑树与之对应。本文要介绍的就是将红黑树转换为2-3-4树或将2-3-4树转换为与之对应的多棵红黑树的算法。算法的基本思想是后序遍历红黑树或2-3-4树,自底向下将每一种红黑树(2-3-4树.原创 2021-12-03 00:53:46 · 974 阅读 · 0 评论 -
c++自顶向下实现红黑树
红黑树自顶向下的详细实现 包括插入和删除操作#include <iostream>#include <algorithm>#include <vector>#include <stack>#include <random>#include <ctime>#include <string>using namespace std;//自顶向下插入和删除算原创 2021-12-03 00:39:13 · 985 阅读 · 1 评论 -
红黑树详细分析与c++实现
红黑树详解以及插入删除操作的实现原创 2021-12-03 00:30:37 · 437 阅读 · 1 评论 -
AVL树详解与实现
AVL树详细分析以及插入删除的c++实现原创 2021-12-02 23:52:39 · 1236 阅读 · 2 评论