二叉树
van之风
这个作者很懒,什么都没留下…
展开
-
P3884 [JLOI2009]二叉树问题
一这道题也很简单,核心是寻找两个点的最大深度公共父节点(也就是说距离两个点的最近的公共父节点)想要求公共父节点就要用到一个算法:Tarjan离线算法Tarjan是一人的人名,叫塔尔杨,是美国的计算机科学家~至今任活着这个算法思路很简单,大致概括为这几句话1.任选一个点为根节点,从根节点开始。2.遍历该点u所有子节点v,并标记这些子节点v已被访问过。3.若是v还有子节点,返回2,否则...原创 2020-04-27 16:26:00 · 224 阅读 · 0 评论 -
P1030 求先序排列
这道题有100种做法,我们一如既往的用建树的方法~但是一定要找准左右子树的先序后续的范围呦,我因为没有找对范围A了20来分钟#include <iostream>using namespace std;#define Max 10000struct Node{ Node *left,*right; char c;};string str1,str2;...原创 2020-04-26 19:04:08 · 122 阅读 · 0 评论 -
P1305 新二叉树
此题我第一反应就是map,STL果然天下第一~下面是AC代码#include <iostream>#include <map>#define Max 10000using namespace std;void print(char root);struct Node{ char left,right;};map<char,Node>...原创 2020-04-26 12:32:12 · 113 阅读 · 0 评论 -
P1229 遍历问题
这道题其实很简单,看着挺复杂。其实是用来唬人的先想一下,为什么给定中序和前序 或者 中序和后续就能唯一确定一颗二叉树?答案是:可以每次由前序 后者 后续确定树的根节点,然后去中序中去寻找这个根节点,这样就可以划分出左子树和右子树了。但是前序和后续就没办法确定,我们无法对其进行划分。那么是什么导致前序和后续中序结果的不同呢?如图所示的二叉树,其前序:ABC,后续:BAC,他的中序是唯一的...原创 2020-04-26 11:17:00 · 356 阅读 · 0 评论 -
P5076 【深基16.例7】普通二叉树(简化版)
这道题的正解应该是bst,但是写bst太复杂了。只好对可怜的STL下手,STL支持迭代器+数字的好像只有string 和 vector,其他迭代器智能++,–,不能加减数字我们这里使用multiset,multiset和set不同的是mulltiset可以不用去重,但是其序列是从小道道排列好的,非常方便插入一个元素下面是AC代码~~#include <iostream>#in...原创 2020-04-21 23:29:43 · 267 阅读 · 0 评论 -
P1827 [USACO3.4]美国血统 American Heritage
这道题可以说是很好的一道二叉树入门题,这道题有很多种做法,这里介绍一种最简单的做法,建树的操作如图所示,先在前序中找到第一个节点C,然后去中序中查找C的位置我们设前序的序列为Lpre–Rpre中序为L-mid—R–mid设找到C的位置为k,那么此时可以用C把左右子树划分,并将C作为树的根节点左子树的个数为K-L-mid,右子树的个数为R-mid-K;我们用同样方法将左右子树分别进...原创 2020-04-21 14:41:12 · 635 阅读 · 0 评论 -
P4913 【深基16.例3】二叉树深度
这道题题目描述不太清楚是这样的图画出来就很清楚了,直接dfs即可,下面是AC代码~#include <iostream>#include <utility>using namespace std;#define Max 10000001typedef pair<int,int > Node;Node a[Max] ;//存储左右孩子int...原创 2020-04-21 10:05:44 · 407 阅读 · 0 评论 -
P4715 【深基16.例1】淘汰赛
这道题比较简单,方法有多种。这里就介绍一种线段树的做法我们搞个结构体就行,存储国家编号和能力值#include<iostream>#include <utility>using namespace std;typedef pair<int ,int > Node;Node a[150] ,tree[600]; //pair<int ,in...原创 2020-04-21 09:34:45 · 334 阅读 · 0 评论 -
线段树
掌握了二叉树不掌握线段树真的有点可惜的,线段树本身并不难,代码也容易理解。这玩意发明出来就是为了提高效率的,例如:你现在要在数组中计算任意一段区间 Li-------Lj 之间的和,如果采用数组遍历,那么时间复杂度肯定是O(n),当然你说你可以前缀处理,可以让时间复杂度达到o(1),问题是你前缀处理的时间加起来中和考虑一波,你还是难以逃脱o(n)的魔掌,并且如果数组中有一个节点的值改变了,你不得将...原创 2020-04-20 23:08:35 · 1103 阅读 · 0 评论