![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
二叉树
leetCode涉及二叉树的算法
消灭猕猴桃
保持热爱,奔赴山海
展开
-
[leetCode]95. 不同的二叉搜索树 II
题目链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。示例:输入:3输出:[ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3]]解释:以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3原创 2020-11-13 18:37:38 · 113 阅读 · 0 评论 -
[leetCode]101对称二叉树
解法1使用递归求解,把该问题转化为:两棵树在什么情况下是镜像的?两颗树的根节点相同每个树的右子树和令一棵树的左子树相同这样可以通过两个指针的同时移动来遍历这棵树,一开始指针p、q同时指向根节点。指针p左移时,q右移动判断值是否相等; 指针p右移时,q左移动判断值是否相等。C++/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * .原创 2020-05-31 20:42:29 · 255 阅读 · 0 评论 -
[leetCode]112.路径总和
递归判断根节点到叶子结点路径上的和是否为sum 可以转化为子树根结点到叶子节点的和是否为sum-root.val,所以若当前结点是叶子结点只需要判断叶子节点的值是否为sum,否则递归处理子问题 * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { publ原创 2020-07-10 10:26:24 · 130 阅读 · 0 评论 -
[leetCode]111.二叉树最小深度
递归与求二叉树最大深度一样可以使用递归求解,但要注意左子树或右子树为null的情况。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public int minD.原创 2020-07-09 10:47:10 · 92 阅读 · 0 评论 -
[leetCode]110.平衡二叉树
递归 自顶向下需要重复计算子树的高度/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public boolean isBalanced(TreeNode root.原创 2020-07-08 10:20:16 · 113 阅读 · 0 评论 -
[leetCode]108.将有序数组转化为二叉搜索树
解法中序遍历-递归选择不同的中间位置可以产生不同的高度平衡二叉搜索树lo +(hi - lo)/2 或 (lo + hi)/2 选择中间位置左边数字作为根节点lo+(hi - lo)/2 + 1 或 (lo + hi +1)/2 选择中间位置右边数字作为根节点lo+(hi - lo)/2 + rand.nextInt(2) 或 (lo + hi +rand.nextInt(2))/2 选择中间位置任意数字作为根节点/** * Definition for a binary tree.原创 2020-07-07 10:36:45 · 100 阅读 · 0 评论 -
[leetCode]107.二叉树层次遍历II
解法 BFS按层次从顶至下遍历,将每层结点加在队列尾部,每次从头部取出一层结点。使用栈将结果反转。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public .原创 2020-07-06 11:55:21 · 103 阅读 · 0 评论 -
[leetCode]104.二叉树的最大深度
解法一 递归/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public int maxDepth(TreeNode root) { if(root原创 2020-07-05 16:53:47 · 116 阅读 · 0 评论 -
[leetCode]100.相同的树
解法一 递归从根结点开始,首先判断两棵树根节点是否为null,再判断是否相等,然后再对左子树与右子树进行相同的操作。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution {原创 2020-07-04 13:03:40 · 85 阅读 · 0 评论 -
[leetCode]07.重建二叉树
递归前序遍历为:| 根结点 | 左子树 | 右子树 |中序遍历为:| 左子树 | 根结点 | 右子树 |以前序遍历中的根节点到中序遍历中寻找根节点,这样就能知道左右子树的长度。左右子树有符合相同的查找模式,所以可以使用递归。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * Tr.原创 2020-08-02 11:41:15 · 183 阅读 · 0 评论 -
[leetCode]剑指 Offer 28. 对称的二叉树
递归解法一棵二叉树是对称的则其左右子树互为镜像,因此可以递归判断左右子树是否互为镜像来判断二叉树是否对称。class Solution { public boolean isSymmetric(TreeNode root) { if(root == null) return true; return isSymmetric(root.left, root.right); } private boolean isSymmetric(TreeNo.原创 2020-08-23 09:20:04 · 134 阅读 · 0 评论 -
[leetCode]剑指 Offer 27. 二叉树的镜像
递归通过观察可以发现,只需交换非叶子节点的左右子节点即可完成镜像。通过前序遍历,从上至下进行递归,如果非叶子节点则交换其子节点,如果为叶子节点,则返回其本身(只有一个节点的情况)。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = .原创 2020-08-22 09:15:26 · 207 阅读 · 0 评论 -
[leetCode]剑指 Offer 26. 树的子结构
解法递归求解过程可以分为两步:1. 遍历A中节点,找到与B中根节点相同的节点第一步可以使用递归实现线序遍历2. 判断是否存在相同的结构第二步可以可以使用递归判断A、B左右子树结构是否相同/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { v.原创 2020-08-21 07:25:11 · 111 阅读 · 0 评论 -
[leetCode]剑指 Offer 37. 序列化二叉树
递归可以使用前序遍历将二叉树序列化为字符串,遇到null用字符串“null,”代替。反序列化时将序列化的结果转化为String数组,每次读取一个字符串,如果是数字则按照前序遍历继续递归。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val .原创 2020-08-31 10:13:00 · 136 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
后续遍历 第一种解法是通过递归计算每个节点左右子树的深度,如果左右子树深度差都不超过1那么这棵树为平衡二叉树。 上面的解法或重复遍历节点。为了解决这个问题可以使用后续遍历:遍历每个节点,在遍历一个节点是已经遍历了它的左子树和右子树。这样只需在遍历每个节点时记录它的深度值,就能一边遍历一边判断每个节点是不是平衡的,代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * .原创 2020-09-19 10:06:53 · 152 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度
递归如果一棵二叉树没有左右子树那么深度为1;如果只有左子树那么深度为左子树深度加1;如果只有右子树那么深度为右子树深度加1;如果既有左子树,又有右子树那么深度为左右子树深度的最大者加1class Solution { public int maxDepth(TreeNode root) { if(root == null) return 0; int leftDepth = maxDepth(root.left); int rightDepth .原创 2020-09-19 09:54:44 · 71 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点
解法 中序遍历通过右节点->根节点->左节点的顺序即可将二叉搜索树从大到小输出。可以通过一个计数器k进行计数当k为1时就到达了目标值。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class.原创 2020-09-18 10:31:32 · 81 阅读 · 0 评论 -
[leetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先
解法从根节点开始,判断p,q是否存在于当前节点的左子树和右子树之中:如果存在则当前节点为pq的最近公共节点如果p q 在当前节点的左子树则遍历左子树如果p q 在当前节点的右子树则遍历右子树class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null) return null; .原创 2020-09-30 13:27:12 · 91 阅读 · 0 评论 -
[leetCode]剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
思路从根节点开始遍历:如果当前节点大于p,q 那么p,q的最近公共节点在当前节点的左子树如果当前节点小于p,q 那么p,q的最近公共节点在当前节点的右子树如果当前节点的值不满足上述两条要求,那么说明当前节点就是「分岔点」。此时,pp 和 qq 要么在当前节点的不同的子树中,要么其中一个就是当前节点。递归class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q.原创 2020-09-30 10:45:05 · 68 阅读 · 0 评论 -
[leetCode]116. 填充每个节点的下一个右侧节点指针
层次遍历思路:按层遍历每一个节点,将每一层的节点相连接/*// Definition for a Node.class Node { public int val; public Node left; public Node right; public Node next; public Node() {} public Node(int _val) { val = _val; } public Node.原创 2020-10-15 09:04:13 · 64 阅读 · 0 评论 -
[leetCode]669. 修剪二叉搜索树
递归class Solution { // 1. 确定函数参数以及返回值 public TreeNode trimBST(TreeNode root, int low, int high) { // 2.确定终止条件 if (root == null) return null; // 3. 确定单层递归逻辑 // 返回下一层合适的节点 if (root.val < low) return trimBST.原创 2020-10-22 09:36:18 · 93 阅读 · 0 评论 -
[leetCode]968. 监控二叉树
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { // 每个节点右三种状态:0.无覆盖 1.有摄像头 2.有覆盖 private final Integer .原创 2020-10-21 11:29:54 · 74 阅读 · 0 评论 -
[leetCode]538. 把二叉搜索树转换为累加树
博客园:题目链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。示例1:输入.原创 2020-10-24 11:00:27 · 247 阅读 · 0 评论 -
[leetCode]144. 二叉树的前序遍历
博客园:题目链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal给定一个二叉树,返回它的 前序 遍历。 示例:输入: [1,null,2,3] 1 \ 2 / 3 递归class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<.原创 2020-10-27 13:16:33 · 84 阅读 · 0 评论 -
[leetCode]105. 从前序与中序遍历序列构造二叉树
博客园:题目链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ .原创 2020-10-28 10:20:04 · 102 阅读 · 1 评论 -
[leetCode]106. 从中序与后序遍历序列构造二叉树
博客园:题目链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \.原创 2020-10-27 22:10:49 · 148 阅读 · 0 评论 -
[leetCode]129. 求根到叶子节点数字之和
博客园: https://www.cnblogs.com/PythonFCG/p/13895105.html题目链接:https://leetcode-cn.com/problems/sum-root-to-leaf-numbers给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。示例 1:.原创 2020-10-29 09:52:02 · 118 阅读 · 0 评论 -
[leetCode]450. 删除二叉搜索树中的节点
递归需要想清楚五种情况如注释所示,利用递归的返回值来删除目标节点class Solution { public TreeNode deleteNode(TreeNode root, int key) { // 第一种情况,没有找到删除节点直接返回null if (root == null) return root; if (root.val == key) { // 第二种情况,左右孩子都为空(叶子节点)直接返回null原创 2020-11-04 22:03:51 · 75 阅读 · 0 评论 -
[leetCode]701. 二叉搜索树中的插入操作
题目题目:链接:https://leetcode-cn.com/problems/insert-into-a-binary-search-tree给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。递归class Solution { public TreeNode in原创 2020-11-04 16:26:31 · 133 阅读 · 0 评论 -
[leetCode]235. 二叉搜索树的最近公共祖先
题目https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,nu原创 2020-11-04 15:44:39 · 100 阅读 · 0 评论 -
[leetCode]501. 二叉搜索树中的众数
题目链接:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树例如:给定 BST [1,null,2,2], 1 \ 2 / 2返回[2].原创 2020-11-04 14:44:18 · 848 阅读 · 1 评论 -
[leetCode]530. 二叉搜索树的最小绝对差
题目链接:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。示例:输入: 1 \ 3 / 2输出:1解释:最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。提示:树中至少有 2 个节点。递归二叉搜索树是有序的,其中序遍历是一个有序数组,如果求一原创 2020-11-04 13:33:27 · 170 阅读 · 0 评论 -
[leetCode]98. 验证二叉搜索树
递归 二叉搜索树转化为有序数组class Solution { List<Integer> ans = new ArrayList<>(); public boolean isValidBST(TreeNode root) { traversal(root); for (int i = 1; i < ans.size(); i++) { if (ans.get(i) <= ans.get(i-1原创 2020-11-04 11:41:08 · 65 阅读 · 0 评论 -
[leetCode]700. 二叉搜索树中的搜索
题目链接:https://leetcode-cn.com/problems/search-in-a-binary-search-tree给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。例如,给定二叉搜索树: 4 / \ 2 7 / \ 1 3和值: 2你应该返回如下子树: 2 / \原创 2020-11-04 10:57:27 · 127 阅读 · 0 评论 -
[leetCode]57. 插入区间
一次遍历这题的关键是判断两个区间是否存在交集,比如区间S1[l1,r1],S2[l2,r2];如果r1<l2说明S1在S2左侧无交集,如果l1>r2则说明S1>S2则S1在S2右侧无交集,如果不符合以上两个条件则说明有交集,S_1[l_1,r_1],S_2[l_2, r_2];如果r_1<l_2说明S_1在S_2左侧无交集,如果l_1>r_2则说明S_1>S_2则S_1在S_2右侧无交集,如果不符合以上两个条件则说明有交集,S1[l1,r1],S2[l2,r2原创 2020-11-04 10:02:24 · 97 阅读 · 0 评论 -
[leetCode]617. 合并二叉树
题目链接:https://leetcode-cn.com/problems/merge-two-binary-trees给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例 1:输入: Tree 1 Tree 2原创 2020-11-03 19:59:04 · 75 阅读 · 0 评论 -
[leetCode]654. 最大二叉树
题目链接:https://leetcode-cn.com/problems/maximum-binary-tree给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个树的根节点。示例 :输入:[3,2,1,6,0,5]输出:返回下面这棵树的根节点: 6 / \原创 2020-11-03 19:02:49 · 103 阅读 · 0 评论 -
[leetCode]236. 二叉树的最近公共祖先
递归思路:直观的想法是从底向上遍历,如果发现p在当前节点左子树q在当前节点右子树或者p在当前节点右子树,q在当前节点左子树时则说明当前节点是p与q的最小公共祖先。二叉树的后序遍历正好符合自底向上的遍历条件,因此使用后序遍历。这题由于要使用回溯所以返回值不能为空class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { // root为null代表没原创 2020-11-03 16:43:50 · 84 阅读 · 0 评论 -
257. 二叉树的所有路径
题目链接:https://leetcode-cn.com/problems/binary-tree-paths给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3递归class Solution { List<Str原创 2020-11-03 16:12:11 · 77 阅读 · 0 评论 -
113. 路径总和 II
题目链接:https://leetcode-cn.com/problems/path-sum-ii给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \原创 2020-11-03 15:35:53 · 91 阅读 · 0 评论