树
深街酒徒*
专业气氛组成员
展开
-
供应链总销售额 Java,c++题解 (求叶子结点权值总和,dfs,bfs,dfs记忆化搜索)【PAT甲级1079】
求根结点到叶子结点的总权值,用dfs深搜可以递归当前结点的儿子,直到遇到叶子结点时累加权值,但Java的dfs有两个测试点过不去,同样的思路换成c++直接AC;bfs可以在出队时判断是否为叶子结点,并将权值累加;用dfs记忆化搜索当前结点的深度,递归时将搜到的结果都保存下来,最后遍历叶子结点将权值累加。原创 2022-04-21 21:02:57 · 1176 阅读 · 0 评论 -
最大的一代 Java代码 (求树中结点数最多的一层的结点数量,dfs,bfs)【PAT甲级1094】
求树中结点数量最多的一层,可以用深搜,传入两个参数:根结点,深度。每次递归根结点的儿子,并将这层的结点数加一,最后遍历各个深度找最大的结点的数量;也可以用宽搜:每次遍历只遍历一层,一层遍历完再将这层的所有儿子加入队列,记录每层结点数量的最大值,直到都遍历完。原创 2022-04-21 16:25:17 · 561 阅读 · 0 评论 -
等重路径 Java代码 (求树中从根结点到叶子的权值,bfs,dfs)【PAT甲级1053】
求从根结点到叶子结点的总权值,可以用深搜,不断递归搜索儿子结点,当递归到叶子时,判断当前的权值总和,并将此时的路径保存,回溯时再恢复到前一步的状态。宽搜时,先将从根结点到每个结点的权值记录下来,同时记录路径,再遍历这些点的权值,找权值等于s的并且是叶子结点的权值,最后输出。原创 2022-04-21 14:57:01 · 580 阅读 · 0 评论 -
L2-031 深入虎穴 (25 分) Java题解 (树的最大深度dfs,bfs)
找最大深度的编号,由于答案唯一,所以宽搜到的最后一个结点就是bfs扩展最远的点;也可以深搜,通过递归左右儿子更新最大深度时更新结点编号,但dfs有两个点没过,找不出原因。原创 2022-04-19 16:41:30 · 605 阅读 · 1 评论 -
Z 字形遍历二叉树 Java题解(树的各层结点数,树的深度,bfs)【PAT甲级1127】
因为结点权值均不同,可以用map存储各结点的左右儿子,构造出二叉树。再通过层序遍历,将奇数层的序列翻转,偶数层的不变,最后输出结果。控制遍历到哪一层时,可以通过两个while循环:当内层while循环完时,表明一层结束,再统一将这一层的左右儿子入队,从而控制层数。也可以先深搜出各层的结点数,while循环内通过for控制队列的出队元素数。原创 2022-04-19 12:59:57 · 263 阅读 · 0 评论 -
后序遍历 Java题解 (前序+中序求后序)【PAT甲级1138】
通过递归找到第一次后序遍历到的位置,输出第一个答案后直接退出程序。但第四个测试点始终过不去,既不超时也不超限,答案错误。。。原创 2022-04-18 23:34:15 · 286 阅读 · 0 评论 -
完全二叉树 Java题解 (给定树判断是否为CBT)【PAT甲级1110】
判断一棵树是否为完全二叉树,可以从完全二叉树的性质判断:除了最后一层外,其余层都没有空缺,即当把n个结点填充到完全二叉树中,最后一个结点的编号一定是n。可以假定当前树是一颗完全二叉树,通过比较树中最大结点编号是否与结点总数相等来判断是否合法。代码实现:可以在遍历树时,传入一个参数k,表示当前结点在完全二叉树中的编号,通过更新k求最大编号,传入左儿子时,编号乘以2.右儿子时乘以2加1。原创 2022-04-18 18:40:36 · 148 阅读 · 0 评论 -
反转二叉树 Java代码 (二叉树,中序遍历,层序遍历)【PAT甲级1102】
要将二叉树翻转,可以先按题意建好树,再递归将每个结点的左右结点都交换,也可以再输入时就直接交换。还需要通过“入度”确定根结点,最后通过dfs中序遍历,bfs层序遍历。原创 2022-04-18 16:42:03 · 279 阅读 · 0 评论 -
构建二叉搜索树 Java代码 (中序遍历,dfs,bfs)【PAT甲级1099】
先按给出的方式构造出树,要想使给定的数满足二叉搜索树,由于二叉搜索树的中序遍历为递增的有序序列,所以将给定的权值先递增排序,在对树中序遍历时,将权值记录。最后通过宽搜输出层序遍历。原创 2022-04-18 15:42:34 · 295 阅读 · 0 评论 -
再次树遍历 Java代码 (前序+中序求后序)【PAT甲级1086】
一种规律是:第一个操作一定是push操作,且这个元素一定就是根结点;从第二个操作起,当上个操作为push时,则当前push进的元素为上个push的元素的左儿子,当上步操作为pop时,当前push进的元素就是pop出的元素的右儿子。所以通过模拟记录每个结点的左右儿子,从而构造出树,最后遍历树得到后序序列。另一种规律是:push的序列实际上就是前序遍历的结果,而pop出的元素序列就是中序遍历的结果,从而转化成通过前序+中序求后序的问题。原创 2022-04-18 14:17:26 · 255 阅读 · 0 评论 -
完全二叉搜索树 Java代码 (构造二叉树)【PAT甲级真题1064】
完全二叉树定义:除了树的最后一层权值没有达到最大值外,其余层都为最大值。完全二叉树的存储:可以用一维数组存储,由于给定任意一个结点x,都可以求出他的左儿子:2x,右儿子 2x+1,所以默认二叉树的根结点为1号索引(避免0乘以任何数都为0造成死递归)。要想使得完全二叉搜索树,还需要满足二叉搜索树的性质:即完全二叉搜索树的中序遍历为递增的有序序列,所以在用结点填充数组时,先提前保证数组有序。原创 2022-04-18 11:25:49 · 443 阅读 · 0 评论 -
判断二叉搜索树 Java代码 (中序+前序求后序,镜像)【PAT甲级1043】
给定前序和中序求后序,主要是找根结点在中序序列中的位置,从而不断递归分割中序序列,而前序序列中根结点就是该序列的第一个位置。给定二叉搜索树(BST)的前序序列,相当于同时给定了前序+中序,因为二叉搜索树的中序遍历就是从小到大递增的顺序,题目限定了左子树是严格小于根结点的,所以当排序后若出现两个权值相等时的结点,要选第一次出现的点,确保之后的点都在它的右子树上。原创 2022-04-18 08:12:30 · 389 阅读 · 0 评论 -
最深的根 Java题解 (求连通块数量,无向图树的深度,dfs,bfs)【PAT甲级1021】
先判断给定的结点是否为树,当可以是树时,图中一定只有一个连通块,并且输入给出了n个点,n-1条边,所以这唯一的连通块一定是无环连通图,即树。判断连通块个数:宽搜,每搜一次,将扩展到的点都做标记,当搜完某个点后,如果图中剩余的点都被标记过,说明是联通的,否则不是。满足树时,还需要确定根结点,但是因为两两边都是无向边,所以根结点无法确定,可以将所有顶点都视为根结点,深搜判断树的最大深度:无向边需要记录父结点,防止遍历的倒回去。宽搜求树的树的最大深度:将树的每条边都看作权值为一,找可以扩展到的最大距离。原创 2022-04-17 00:43:53 · 473 阅读 · 0 评论 -
L2-038 病毒溯源 (25 分) Java题解 (树的深度,dfs,记录路径)
求树的从根节点开始的最长的路径,只要找到根结点的所有儿子结点为根结点的最长路径即可,找到时,记录该结点的儿子结点,两个二子结点路径相等时,找最小结点号的儿子,最后输出路径。原创 2022-04-16 22:24:40 · 773 阅读 · 1 评论 -
树的遍历 Java代码 (中序和后序构建树)【PAT甲级1020】
构建的方式:通过中序序列和后序序列可以唯一确定一颗二叉树,这是因为后序序列的最后一个值便是根结点 t ,而这个根结点将中序序列又分成了左右两部分,中序遍历的左右两部分加上后序遍历的左右两部分又可以分别确定两棵树,这两棵树又能确定两个根结点,即 t 的左右子树的根结点,依此递归下去,直到不能再划分为止。原创 2022-04-15 20:55:27 · 265 阅读 · 0 评论 -
数叶子结点 Java题解 (dfs) 【PAT甲级1004】
递归终止条件:到达叶子结点,不能再递归,不是叶子结点时,一直递归直到成为叶子结点。满足题意条件:每层的叶子结点总和,递归的深度就是层数,通过传入深度的参数记录每层的叶子数。原创 2022-04-15 17:31:12 · 252 阅读 · 0 评论 -
846. 树的重心 Java题解 (dfs)
在建立了邻接表形式的树后,通过深度搜索树的每个分支的结点数,找删除树中某个结点后每个联通块的最大值的最小值。原创 2022-04-10 18:10:58 · 766 阅读 · 0 评论 -
1207. 大臣的旅费 Java题解 (树的直径,dfs,bfs)【第四届蓝桥杯省赛C++A组,JAVA A组】
因为“从首都到达每个城市的距离都是唯一的”,所以由城市构成的图事实上是无环图,而无环图就是一棵树。花费的路费为 10s + s(s +1) / 2 ,当距离s为有意义的正数时,路费是随着距离s单调递增的,所以求路费的最大值,就是求在两城市间距离的最大值。在给定一棵树后,求树中长度最长的路径就是求树的直径。求树的直径分两步:①任取一点x,求其余点距离x最远的点y,此时的y就是树直径的一个端点。②求其余点距离y最远的点z,yz之间的距离即为树的直径。原创 2022-04-02 17:06:27 · 933 阅读 · 0 评论 -
1240. 完全二叉树的权值 Java题解 (双指针)【第十届蓝桥杯省赛C++A/B组,JAVA A组】
设 i 完全二叉树的第 i 层,则第 i 层的开始下标为 2^(i - 1),第 i 层的结束下标为 2^ i - 1。通过双层循环,外层控制二叉树的层数,内层计算每一层的和,求最大值。时间复杂度为O(n).原创 2022-04-01 21:42:01 · 660 阅读 · 0 评论 -
1270. 数列区间最大值 Java题解 (线段树)
题意为找出任意两区间中的最大值,由于询问的次数是百万级的,可以用线段树存储数列的数据:在树的每个结点中维护区间的左右端点和当前区间的最大值,查找时,通过递归实现 logn 的复杂度。总的时间复杂度为 O(mlogn)。原创 2022-03-29 17:44:58 · 1135 阅读 · 0 评论 -
1264. 动态求连续区间和 Java题解(线段树)
线段树:对动态数组修改元素后,快速求区间的和。时间复杂度为:O(logn)操作:①单点修改,递归+回溯实现。②区间查询。存储方式:将树的结点存入一维数组中,事实上就是一颗二叉树。原创 2022-03-29 16:02:49 · 754 阅读 · 0 评论 -
完全二叉树的权值 java 题解 【2019第十届蓝桥杯省赛】【第七题】
完全二叉树的权值 java 题解 【2019第十届蓝桥杯省赛】【第七题】数组原创 2022-01-27 08:00:00 · 494 阅读 · 0 评论 -
算法训练 求先序遍历 java 题解 549
问题描述 给出一棵二叉树的中序与后序排列,求出它的先序排序(约定树结点用不同的大写字母表示,长度<=200)。输入格式 第1行为二叉树的中序遍历结果,第2行为二叉树的后序遍历结果输出格式 1行,为二叉树的先序遍历结果样例输入BADCBDCA样例输出ABCD解题思路:后序遍历的最后一个元素为根结点,该结点在中序遍历中将中序串分为左右两颗子树。递归即可。设当前串后序遍历最后一个元素在中序串中索引为index。当前中序串中左子树:(left原创 2021-10-19 20:02:31 · 143 阅读 · 0 评论 -
算法训练 根据前、中序遍历求后序遍历 java 题解 705
问题描述 给定一棵二叉树的前序遍历和中序遍历序列,用你所熟悉的程序设计语言生成该二叉树,并将其后序遍历打印出来。为便于编程,二叉树的结点用单个大写英文字母表示,且结点互不重复。比如,输入前序遍历序列为DBACPMZX,中序遍历序列为ABCDMPXA,应生成的二叉树结构如下图所示: 应输出的后序遍历序列为ACBMXZPD输入格式 两行两个大写字母字符串,分别代表前序和中序遍历输入格式 一行表示后序遍历样例输入DBACPMZXABCDMPXZ样例输出.原创 2021-10-19 19:46:10 · 386 阅读 · 0 评论 -
算法提高 第三题 java 题解 1094
第三题(20分) 题目描述: 有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1。在结点1处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点。 一些小猴子从结点1处开始往下跑,最后一个小猴儿会跑到哪里呢?输入格式 输入二叉树叶子的深度D,和小猴子数目I,假设I不超过整棵树原创 2021-10-14 16:50:34 · 199 阅读 · 0 评论 -
L2-035 完全二叉树的层序遍历 (25 分) java 题解
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为D的,有N个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前N个结点,这样的树就是完全二叉树。给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。输入格式:输入在第一行中给出正整数N(≤30),即树中结点个数。第二行给出后序遍历序列,为N个不超过 100 的正整数。同一行中所有数字都以空格分隔。输出格式:在一行中输出该树的层序遍历序列。所有数字都以 1 个空格分隔,行...原创 2021-10-08 23:45:54 · 325 阅读 · 4 评论