leetcode刷题
笨鸟先飞的橘猫
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
leetcode刷题记录 二叉树的最近公共祖先
leetcode 二叉树的最近公共祖先解题思路:根据以上定义,若 rootroot 是 p, qp,q 的 最近公共祖先 ,则只可能为以下情况之一:p和 q在 root的子树中,且分列 root的 异侧(即分别在左、右子树中);p = root,且q在root的左或右子树中;q = root,且p在root的左或右子树中;考虑通过递归对二叉树进行后序遍历,当遇到节点 p 或 q 时返回。从底至顶回溯,当节点 p, q 在节点 root 的异侧时,节点 root即为最近公共祖先,则向上返回转载 2020-10-08 16:19:44 · 175 阅读 · 0 评论 -
leetcode刷题记录 填充每个节点的下一个右侧节点指针
leetcode 填充每个节点的下一个右侧节点指针解题思路:1.层次遍历,此方法效率一般,但可以解决此题。代码: public Node connect(Node root) { if(root==null) return null; Queue<Node> queue = new LinkedList<>(); queue.add(root); while(!queue.isE转载 2020-10-08 12:25:48 · 165 阅读 · 0 评论 -
leetcode刷题记录 106 从中序与后序遍历序列构造二叉树
leetcode 106 从中序与后序遍历序列构造二叉树我们可以根据后序遍历确定根结点的值,然后在中序遍历里面确认左右子树的范围。利用递归构建左右子树。优化:可以使用hashMap存储中序遍历中的值,增加查询速率。class Solution { int[]postorder; int[]inorder; int root_index; HashMap<Integer,Integer> map = new HashMap<>(); pu原创 2020-09-23 11:09:43 · 267 阅读 · 0 评论 -
leetcode刷题记录 剑指offer 从上到下打印二叉树 Ⅲ
leetcode 剑指offer 从上到下打印二叉树 Ⅲ解题思路:这道题我们可以按照层序遍历的思路做,但是需要注意的是每一层的遍历顺序有所不同,通过观察,假设根结点在第0层,我们可以知道当为奇数层时,是从右往左遍历;偶数层时,是从左往右遍历。那么我们不妨使用BFS+双端队列的方法进行编程。当为偶数层,我们使用addLast将元素添加到队列尾部;奇数层时,用addFirst将元素添加到队列头部。class Solution { public List<List<Integer>原创 2020-09-18 16:11:13 · 141 阅读 · 0 评论 -
leetcode刷题记录 543 二叉树的直径
leetcode 543 二叉树的直径解题思路:题中直径就是找出最长路径。假设我们知道对于该节点的左儿子向下遍历经过最多的节点数 L(即以左儿子为根的子树的深度) 和其右儿子向下遍历经过最多的节点数 R(即以右儿子为根的子树的深度),那么以该节点为起点的路径经过节点数的最大值即为 L+R+1 。我们记节点 node 为起点的路径经过节点数的最大值为 dnode,那么二叉树的直径就是所有节点 dnode的最大值减一。最后的算法流程为:我们定义一个递归函数 depth(node) 计算 dnode,函数转载 2020-09-13 10:31:12 · 148 阅读 · 0 评论 -
leetcode刷题记录 1008 先序遍历构造二叉树
leetcode 1008 先序遍历构造二叉树解题思路:我们使用递归的方法,在扫描先序遍历的同时构造出二叉树。我们在递归时维护一个 (lower, upper) 二元组,表示当前位置可以插入的节点的值的上下界。如果此时先序遍历位置的值处于上下界中,就将这个值作为新的节点插入到当前位置,并递归地处理当前位置的左右孩子的两个位置。否则回溯到当前位置的父节点。算法将 lower 和 upper 的初始值分别设置为负无穷和正无穷,因为根节点的值可以为任意值。从先序遍历的第一个元素 idx = 0 开始构转载 2020-09-11 14:00:25 · 200 阅读 · 0 评论 -
leetcode刷题记录 919 完全二叉树插入器
leetcode 919 完全二叉树插入器解题思路:构造器:声明两个成员变量head(头结点)和队列deque,head指向传进来的树的头结点,然后使用两个双向队列,deque用来存放孩子结点为0或者1的结点,queue用来存放每一层的结点;**插入:**取出deque的第一个结点node即为最左边第一个插入的点,将要插入的结点插入deque最后,以便以后的插入。然后按照从左到右判断node结点的孩子结点是否为空,为空就插入;返回头结点:直接返回头结点head。class CBTInserte原创 2020-09-11 11:59:42 · 195 阅读 · 0 评论 -
leetcode刷题记录 637 二叉树的层平均值
leetcode 637 二叉树的层平均值解题思路:1.可以采取广度遍历,用两个queue存放结点,一个存放第i层的结点,另外一个存放下一层节点。然后遍历完一层就计算其平均值,存入list中。class Solution { public List<Double> averageOfLevels(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); List原创 2020-09-09 00:55:02 · 142 阅读 · 0 评论 -
leetcode刷题记录 894 所有可能的满二叉树
leetcode 894 所有可能的满二叉树解题思路:令 F(N)作为所有含 N 个结点的可能的满二叉树的列表。每个满二叉树 T含有 3 个或更多结点,在其根结点处有 2 个子结点。这些子结点 left 和 right 本身就是满二叉树。因此,对于 N≥3,我们可以设定如下的递归策略:F(N) = [对于所有的 x,所有的树的左子结点来自 F(x) ,而右子结点来自F(N−1−x)]。此外,通过简单的计数参数,没有满二叉树具有正偶数个结点。最后,我们应该缓存函数F之前的结果,这样我们就不必在递归原创 2020-09-08 16:54:53 · 163 阅读 · 0 评论 -
leetcode刷题记录 1305 两颗二叉搜索树中的所有元素
leetcode 1305 两颗二叉搜索树中的所有元素解题思路:我们知道二叉搜索树的中序遍历是升序排列的,所以说我们这道题可以这样做:1.先中序遍历两个二叉树,将遍历的结果分别存放到list1和list2中。2.使用归并排序将两个排好序的list合并,即为我们所求的结果。class Solution { public List<Integer> getAllElements(TreeNode root1, TreeNode root2) { List<In原创 2020-09-08 15:50:15 · 195 阅读 · 0 评论 -
leetcode刷题记录 623 在二叉树中增加一行
leetcode 623 在二叉树中增加一行解题思路:根据题目我们要分两种情况进行讨论。1.当插入的位置为根结点,则我们直接创建一个结点,并让它的左子树连接根结点。2.当插入的位置不是根结点,那我们需要找到插入层的前一层,例如我要插入第三层,那么我需要找到第二层的结点,让其连接新插入的结点,再让新结点连接之前第三层的结点。这个过程我们通过递归遍历二叉树的左右子树,直到depth = n-1时执行上面所说的操作。class Solution { public TreeNode addOneR原创 2020-09-08 11:23:08 · 165 阅读 · 0 评论 -
leetcode刷题记录 124 二叉树中的最大路径和
leetcode 124 二叉树中的最大路径和首先这道题第一个难点就是如何理解题意,题目中路径可以由任意结点出发,即不一定是由根结点出发,例如(9->-10->20)也是一条路径。第二个难点就是怎么计算最大路径和呢?既然我们要计算最大路径和,那我们首先要知道以每个结点为根结点的子树中寻找以该结点为起点的一条路径,使得该路径上的结点值之和最大。所以我们可以设计一个函数maxGain来求一个结点的最大贡献值。具体而言,该函数的计算如下。空结点的最大贡献值等于 0。非空结点的最大贡献值等原创 2020-09-06 20:09:00 · 258 阅读 · 0 评论
分享