文章目录
Day 19 第六章 二叉树 part06
- 今日内容
- ● 654.最大二叉树
- ● 617.合并二叉树
- ● 700.二叉搜索树中的搜索
- ● 98.验证二叉搜索树
654.最大二叉树
- 又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视频,好好体会一下 为什么构造二叉树都是 前序遍历
- 题目链接:https://leetcode.cn/problems/maximum-binary-tree/
- 视频讲解:https://www.bilibili.com/video/BV1MG411G7ox
- 文章讲解:https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html
自己的思路(✅通过)
public static TreeNode constructMaximumBinaryTree(int[] nums) {
return findNode(nums, 0, nums.length);
}
public static TreeNode findNode(int[] nums, int start, int end){
//当数组为空时直接返回空
if(end == start) return null;
//当参数数组中只有一个值时就不需要进入for循环了
//if(end - start == 1) return new TreeNode(nums[start]);
int maxValue = nums[start];
int maxIndax = start;
for(int i = start + 1; i < end; i ++){
if(nums[i] > maxValue) {
maxValue = nums[i];
maxIndax = i;
}
}
TreeNode root = new TreeNode(maxValue);
root.left = findNode(nums, start, maxIndax);
root.right = findNode(nums, maxIndax + 1, end);
return root;
}
随想录代码(优化思路)
当参数数组中只有一个值时就不需要进入for循环了
增加判断条件
if(end - start == 1) return new TreeNode(nums[start]);
617.合并二叉树
- 这次是一起操作两个二叉树了, 估计大家也没一起操作过两个二叉树,也不知道该如何一起操作,可以看视频先理解一下。 优先掌握递归。
- 题目链接:https://leetcode.cn/problems/merge-two-binary-trees/
- 视频讲解:https://www.bilibili.com/video/BV1m14y1Y7JK
- 文章讲解:https://programmercarl.com/0617.%E5%90%88%E5%B9%B6%E4%BA%8C%E5%8F%89%E6%A0%91.html
自己的思路(✅通过但击败0.27%hhh)
public static TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1 == null) return root2;
if(root2 == null) return root1;
TreeNode root = new TreeNode(root1.val + root2.val);
root.left = mergeTrees(root1.left, root2.left);
root.right = mergeTrees(root1.right, root2.right);
return root;
}
优化思路
不重新建一个二叉树,直接修改root1
700.二叉搜索树中的搜索
- 递归和迭代 都可以掌握以下,因为本题比较简单, 了解一下 二叉搜索树的特性
- 题目链接:https://leetcode.cn/problems/search-in-a-binary-search-tree/
- 视频讲解:https://www.bilibili.com/video/BV1wG411g7sF
- 文章讲解: https://programmercarl.com/0700.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%90%9C%E7%B4%A2.html
自己的思路 - 递归(✅通过)
public static TreeNode searchBST_dfs(TreeNode root, int val) {
if(root == null) return null;
if(val == root.val) return root;
//可以合并成
//if(root == null || val == root.val) return root;
if(val < root.val) return searchBST_dfs(root.left, val);
else return searchBST_dfs(root.right, val);
}
自己的思路 - 迭代(✅通过)
思路:从上往下遍历root直到root为空
public static TreeNode searchBST(TreeNode root, int val) {
while(root != null){
if(val < root.val) root = root.left;
else if(val > root.val) root = root.right;
else return root;
}
return null;
}
98.验证二叉搜索树
- 遇到 搜索树,一定想着中序遍历,这样才能利用上特性。
- 但本题是有陷阱的,可以自己先做一做,然后在看题解,看看自己是不是掉陷阱里了。这样理解的更深刻。
- 题目链接:https://leetcode.cn/problems/validate-binary-search-tree/
- 视频讲解:https://www.bilibili.com/video/BV18P411n7Q4
- 文章讲解:https://programmercarl.com/0098.%E9%AA%8C%E8%AF%81%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
自己的思路(不知道咋实现)
中序遍历把结果存储在数组里,然后通过对比中序遍历输出的数是否比上一个数大来实现
随想录方法
思路
- 不需要用数组,用一个全局变量
TreeNode max;
即可 - 因为搜索二叉树要看的是根节点左子树的所有节点都比根节点小,根节点右子树的所有节点都比根节点大,所以要先定义两个布尔变量来表示左子树和右子树是否为搜索二叉树。
代码
❗在力扣如果全局变量和函数全为static则不通过
TreeNode max;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
// 左
boolean left = isValidBST(root.left);
if (!left) {
return false;
}
// 中
if (max != null && root.val <= max.val) {
return false;
}
max = root;
// 右
boolean right = isValidBST(root.right);
return right;
}