有什么网站可以做任务赚钱/网络营销策划书1500字
打卡day13
目 录
- 第一题:剑指 Offer 55 - I. 二叉树的深度
- 第二题:剑指 Offer 55 - II. 平衡二叉树
- 第三题:剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
- 第四题:剑指 Offer 68 - II. 二叉树的最近公共祖先
第一题:剑指 Offer 55 - I. 二叉树的深度
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3/ \9 20/ \15 7
返回它的最大深度 3 。
**提示:**节点总数 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof
解题思路:
树的后序遍历( 深度优先搜索) 往往利用 递归 或 栈 实现.
关键点: 树的深度和其左(右)子树的深度之间的关系。
树的深度 等于 左子树的深度 与 右子树的深度 中的 最大值 +1 。
java代码:
/*** 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) {//特例,root为空时if(root == null){return 0;}int left = maxDepth(root.left);//左子树的深度 int right = maxDepth(root.right);//右子树的深度 return Math.max(left, right)+1;}
}
第二题:剑指 Offer 55 - II. 平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3/ \9 20/ \15 7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1/ \2 2/ \3 3/ \4 4
返回 false 。
限制:
0 <= 树的结点个数 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof
解题思路:
和上题相同,树的深度 等于 左子树的深度 与 右子树的深度 中的 最大值 +1 。
可以构造一个获取当前子树的深度的函数 depth(root) (就是上一题),通过比较某子树的左右子树的深度差 abs(depth(root.left) - depth(root.right)) <= 1 是否成立,来判断某子树是否是二叉平衡树。若所有子树都平衡,则此树平衡。
java代码:
/*** 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) {//特例,为空if (root == null) {return true;}int left = maxDepth(root.left);int right = maxDepth(root.right);int i = Math.abs(left - right);return i <= 1 && isBalanced(root.left) && isBalanced(root.right);}private int maxDepth(TreeNode root) {if (root == null){ return 0;}int left = maxDepth(root.left);//左子树的深度 int right = maxDepth(root.right);//右子树的深度 return Math.max(left, right)+1;}}
第三题:剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
示例 1:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6
解释: 节点 2 和节点 8 的最近公共祖先是 6。
示例 2:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉搜索树中。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof
解题思路:
祖先的定义: 若节点 pp 在节点 root 的左(右)子树中,或 p = root,则称 root是 p 的祖先.
本题给定了两个重要条件:① 树为 二叉搜索树 ,② 树的所有节点的值都是 唯一 的。根据以上条件,可方便地判断 p,q与 root 的子树关系,即:
若 root.val < p.val,则 pp 在 root 右子树 中;
若 root.val > p.val ,则 pp 在 root左子树 中;
若 root.val = p.val ,则 pp 和 root 指向 同一节点 。
java代码:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {while(root != null) {if(root.val < p.val && root.val < q.val){ // p,q 都在 root 的右子树中root = root.right; // 遍历至右子节点}else if(root.val > p.val && root.val > q.val){ // p,q 都在 root 的左子树中root = root.left; // 遍历至左子节点}else break;//分别在左右子树,公共祖先为root}return root;}
}
第四题:剑指 Offer 68 - II. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof
解题思路:
用的递归,和上题一样。
java代码:
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null || root == p || root == q) return root;TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);if(left == null) return right;if(right == null) return left;return root;}
}