随笔分类 - 树相关
摘要:653. 两数之和 IV - 输入 BST 题目描述 题解分析 最简单的方法就是遍历整棵树,找出所有可能的组合,判断是否存在和为 kk 的一对节点。现在在此基础上做一些改进。 如果存在两个元素之和为 k,即 x+y=k,并且已知 x 是树上一个节点的值,则只需判断树上是否存在一个值为 y 的节点,使
阅读全文
摘要:215. 数组中的第K个最大元素 LeetCode-215 另一道类似的第k大元素问题:https://www.cnblogs.com/GarrettWale/p/14386862.html 题目详情 方法一:使用快速排序 package com.walegarrett.interview; /**
阅读全文
摘要:剑指 Offer 68 - II. 二叉树的最近公共祖先 Offer_68_2 题目详情 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/16 14:01 */ /** * 题目描
阅读全文
摘要:剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 Offer_68_1 题目描述 方法一:迭代法 由于该题的二叉树属于排序二叉树,所以相对较简单。 只需要判断两个结点是否在根节点的左右子树中,这可以通过值的大小来判断。 不断迭代左右子树即可得到结果。 package com.walegar
阅读全文
摘要:剑指 Offer 55 - II. 平衡二叉树 Offer_55_2 题目描述 方法一:使用后序遍历+边遍历边判断 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/9 20:58 */ /** * 题目描
阅读全文
摘要:剑指 Offer 49. 丑数 Offer_49 题目详情 解法一:小根堆+哈希表/HashSet 根据丑数的定义,如果a是丑数,那么a2, a3以及a*5都是丑数 可以使用小根堆存储按照从小到大排序的丑数。 package com.walegarrett.offer; import java.ut
阅读全文
摘要:剑指 Offer 41. 数据流中的中位数 Offer_41 题目详情 题解分析 本题使用大根堆和小根堆来解决这个寻找中位数和插入中位数的问题。 其实本题最直接的方法是先对数组进行排序,然后取中位数。但是,这种方法的此方法的时间复杂度为 O(N),其中包括: 查找元素插入位置 O(logN) (二分
阅读全文
摘要:剑指 Offer 40. 最小的k个数 Offer_40 题目描述 解法一:排序后取前k个数 /** * 题目描述:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 */ /** * 方法一:先对数字进行排序,然
阅读全文
摘要:剑指 Offer 37. 序列化二叉树 Offer_37 题目描述 题目解析 本题主要考察的就是二叉树的层次遍历。 层次遍历时可以根据二叉树的特点将空结点也进栈。 反序列化时同样可以根据层次遍历的思路,每次生成当前结点的左右子树指针结点。 java代码 package com.walegarrett
阅读全文
摘要:剑指 Offer 36. 二叉搜索树与双向链表 Offer_36 题目描述 题解分析 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列) 利用排序二叉树中序遍历的性质,可以设置一个前置指针和当前指针。 再遍历完当前结点的所有左子树后,可以得到一个数据值仅次与当前结
阅读全文
摘要:剑指 Offer 34. 二叉树中和为某一值的路径 Offer_34 题目详情 题解分析 本题是二叉树相关的题目,但是又和路径记录相关。 在记录路径时,可以使用一个栈来存储一条符合的路径,在回溯时将进栈的元素出栈,以此可以找到所有的Path。 package com.walegarrett.offe
阅读全文
摘要:剑指 Offer 33. 二叉搜索树的后序遍历序列 Offer_33 题目详情 题解分析 本题需要注意的是,这是基于一颗二叉排序树的题目,根据排序二叉树的定义,中序遍历序列就是数据从小到大的排序序列。 这里有很多的细节问题,特别是在递归时,需要注意递归的出口和判断条件。 解法一:传统的方法 pack
阅读全文
摘要:剑指 Offer 32 - III. 从上到下打印二叉树 III Offer_32_3 题目详情 题解分析 本题我想的比较复杂,其实题目的要求只是需要遍历的结果逆序和正序交替,这个其实可以使用Collections工具类的reverse函数来实现。 这里我根据偶数层和奇数层改变了遍历的顺序,相对较复
阅读全文
摘要:剑指 Offer 32 - II. 从上到下打印二叉树 II Offer_32 题目描述: 题解分析: 这道题我一开始想到的解决方法较粗暴,就是使用两个变量来记录当前层的节点数和下一层的结点数。 以上的方法虽然可行,但是较复杂。实际每次队列里存储的就是当前层的所有结点,利用这个性质可以较快解题。 解
阅读全文
摘要:剑指 Offer 32 - I. 从上到下打印二叉树 Offer_32_1 题目描述 解题思路 这题属于简单题,考察的是我们对二叉树以及层次遍历的方法。 这里只需要使用简单的队列即可完成二叉树的层次遍历。 此外,由于这道题需要返回一个定长数组,但是我一时没有找到合适的将Integer转换为int的方
阅读全文
摘要:剑指 Offer 26. 树的子结构 Offer 26 题目详情: 题解分析 解法一: 第一种比较容易想到的解法就是查看这两棵树的前序遍历和中序遍历序列是否都匹配。 因为前序遍历和中序遍历可以唯一确定一棵树,所以这种方法是有效的,尽管有些复杂。 解法二: 题目是要求一个树是否是另一棵树的子结构。 如
阅读全文
摘要:3348. 树的双亲存储法 ECNU-3348 /** * 这里不能用邻接矩阵的形式存储整个图,因为可能会出现重边的问题。 * 如果是简单的重边,取最短边即可,但是本题需要求出所有的最短路径,所以更长的边 * 对结果会有影响 */ #include<iostream> #include<cstdio
阅读全文
摘要:Cartesian Tree PAT-1167 一开始我使用数组进行存储,但是这样可能会导致无法开足够大的数组,因为树如果是链表状的则无法开这么大的数组(虽然结点很少)。 正确的解法还是需要建树,使用指针。 #include<iostream> #include<cstring> #include<
阅读全文
摘要:Heaps PAT-1147 #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<cstdio> #include<sstream> #include<set> #include<map
阅读全文
摘要:Invert a Binary Tree pat-1102 import java.util.Arrays; import java.util.Queue; import java.util.Scanner; import java.util.concurrent.LinkedBlockingQue
阅读全文