【代码随想录算法训练营Day19】● 654.最大二叉树● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

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.合并二叉树

自己的思路(✅通过但击败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.二叉搜索树中的搜索

自己的思路 - 递归(✅通过)

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.验证二叉搜索树

自己的思路(不知道咋实现)

中序遍历把结果存储在数组里,然后通过对比中序遍历输出的数是否比上一个数大来实现

随想录方法

思路
  1. 不需要用数组,用一个全局变量TreeNode max;即可
  2. 因为搜索二叉树要看的是根节点左子树的所有节点都比根节点小,根节点右子树的所有节点都比根节点大,所以要先定义两个布尔变量来表示左子树和右子树是否为搜索二叉树。
代码

❗在力扣如果全局变量和函数全为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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值