
树、二叉树、堆
文章平均质量分 61
sunday_soft
毕业于东北大学,做教师和软件开发工作
展开
-
二叉树创建、遍历、插入
【代码】二叉树创建、遍历、插入。原创 2023-05-07 20:24:10 · 197 阅读 · 1 评论 -
二叉搜索树
和堆一样,实际上不需要我们自己实现二叉搜索树。许多编程语言都在标准库里实现了简单易用的二叉搜索树。set是像前面所说的一样使用二叉搜索树维护集合的容器,而map则是维护键和键对应的值的容器。所有节点都满足,左子树上的所有节点都比自己小,而右子树的节点都比自己大。以上两种情况都不满足的话,把左儿子的子孙中最大节点提到需要删除的节点上。需要删除节点的左儿子没有右儿子,那么就把左儿子提上去。需要删除节点没有左儿子,那么就把右儿子提上去。3、二叉搜索树的复杂度都为O(log n)原创 2022-09-18 09:11:55 · 257 阅读 · 0 评论 -
优先队列 Fence Repair (PKU 3253)
准备切成的木板的长度为L1、L2、……、Ln. 未切割木板的长度恰好为切割木板的长度和。每次切断木板时,需要的开销为这块木板的长度。例如,长度为21的木板切割成5、8、8的三块木板。长为21的木板切割成13、8时,开销为21.再将长度为13的木板切割成长度5、8时,开销为13.于是合计开销为34。因为只需要从板的集合中取出最短的两块,并且把长度为两块长度之和的板加入集合中即可,所有使用优先队列就可以高效的实现。一共需要进行O(n)次O(log N)的操作,因此总的时间复杂度为O(Nlogn)。原创 2022-09-17 13:03:42 · 113 阅读 · 0 评论 -
优先队列 大根堆 Expedition (POJ 2431)
如果汽车在途中车上的汽油耗尽,卡车就无法继续前行,因而无法到达终点。第i个加油站在距离起点Ai单位距离的地方,最多可以给卡车加Bi单位的油。如果可以到达终点,输出最少加油次数,否则输出-1。分析:因为希望加油次数尽可能少,所以当燃料为0了之后再加油是最好的选择。基于贪心的思想,当燃料为0时,选择能加油量最大的加油站。所以可以用一个优先队列来保存经过的加油站的油量,当需要加油时,取出队列中的最大元素即可。输入格式:输入 N ,L, P的值,再输入N个加油站距离,再输入N个加油站的油量。原创 2022-09-15 18:44:31 · 141 阅读 · 0 评论 -
树的邻接表存储法
树可以使用链式存储结构,也可以使用邻接矩阵和邻接表一、邻接矩阵:我们可以使用一个n×n的bool数组mp,mp[x][y]为true,则表示从x到y存在有向边,为false则表示x到y不存在有向边。邻接矩阵存储代码如下:bool mp[MAXN][MAXN];void link(int x,int y){mp[x][y]=true;}二、邻接表同样,我们可以采用邻接表来存储一个点连出的多条树边,如下图:邻接表的代码如下:int m;int fi[MAXN];//存储结点儿子个数原创 2022-09-09 19:07:36 · 3317 阅读 · 0 评论 -
BST二叉搜索树
二叉树:是一种特殊的树,二叉树的每个节点最多只能有2个子节点。如果我们给二叉树加一个额外的条件,就可以得到一种被称作二叉搜索树(binary search tree)的特殊二叉树。二叉搜索树要求:1.左子树上的所有节点值均小于根节点值2右子树上的所有节点值均不小于根节点值3左右子树也满足上述两个条件二叉搜索树通常有搜索,插入,删除,寻找最大最小节点等操作。搜索:在搜索元素x的时候,我......原创 2020-02-21 10:47:31 · 330 阅读 · 0 评论 -
treap(tree+heap就是二叉搜索树+堆)
1、Treap的定义Treap是一棵二叉搜索树,只是每个节点多了一个优先级fix,对于每个节点,该节点的优先级小于等于其所有孩子的优先级。当然,引入优先级fix的目的就是防止退化成一条链,从而影响查找效率。所以,这样看来就是:Treap中对于节点的关键字key来说,它是一棵二叉搜索树,而对于fix来说,它是一个最小堆,所以Treap可以看成是Tree+Heap,只是这里的Heap不一定是完全二......原创 2020-02-23 15:18:33 · 675 阅读 · 0 评论 -
Treap的更多操作和技巧
查找、插入、删除是平衡树最基本的三种操作,但是在实际的应用中许多其他的操作都是必要的,而且Treap这种强大的数据结构的功能远远不止此,下面我们要讨论的是Treapp更多的操作,以及一些技巧。Treap插入和删除操作参考前面博文treap(tree+heap就是二叉搜索树+堆)查找最值在BST的删除中,我们需要通过找待删除节点的后继(或前驱),也就是其右子树的最大值(左子树的最小值)在平......原创 2020-03-04 21:01:56 · 858 阅读 · 0 评论 -
邻值查找CH1301(平衡树)
给定一个长度为 n 的序列 A,A 中的数各不相同。对于 A 中的每一个数 A i ,求:m i n ( 1 ≤ j < i ) ∣ A i − A j ∣,以及令上式取到最小值的 j(记为 P i )。若最小值点不唯一,则选择使 A j 较小的那个。数据范围:n<=105 ,|Ai|<=109题解:可以借助set来实现,set的查找是O(log n)的,最终的时间复杂度大约为O(n log n)#include<iostream>#include<cs原创 2020-10-16 11:02:08 · 422 阅读 · 0 评论 -
平衡树(STL set)
C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入、排序、删除、查找等。让用户在STL使用过程中,并不会感到陌生。关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类原创 2020-10-16 11:39:34 · 1615 阅读 · 0 评论 -
树的存储及遍历方法
一、有根树的父亲表示法除根节点外其他结点有且只有一个父节点,因此,我们可以把每一条边存储在其子结点上。记录形式为i结点的父亲是j结点如下图:father[a]=-1(表示不存在)father[b]=afather[c]=afather[d]=afather[e]=c…父亲表示法存储结构代码如下:int fa[MAXN]void link(int x,int y){fa[x]=y;}也可以用结构体来存储struct node{int data,parent}node原创 2021-05-27 11:24:40 · 978 阅读 · 1 评论