LeetCode 98 验证二叉搜索树 -- 递归法和迭代法

news/2024/7/20 21:30:04 标签: leetcode, 深度优先, 算法

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree


题意:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3]
输出:true

示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:
树中节点数目范围在[1, 104] 内
-231 <= Node.val <= 231 - 1


参考文章

思路:

做这道题之前,首先要理解二叉搜索树的概念与特点。

其次,做这道题的时候容易陷入一个陷阱,就是只单纯地将中间节点与左节点和右节点进行比较,直接返回结果。我第一次写这道题时候的代码是:

class Solution {
	public boolean isValidBST(TreeNode root) {
		boolean ans = true;
		if (root.left != null) ans = ans && root.val > root.left.val && isValidBST(root.left);
		if (root.right != null) ans = ans && root.val < root.right.val && isValidBST(root.right);
		return ans;
	}
}

直接就WA了,解答错误的测试用例是:[5,4,6,null,null,3,7],预期结果是false,而代码返回的结果是true。这个测试用例所形成的树是:
在这里插入图片描述
在这个测试用例中,每个节点都满足左节点小于中间节点、右节点大于中间节点,所以代码返回的结果是true,但是实际上这个测试用例并不满足二叉搜索树的定义,节点值为3的节点是不应该出现在这个位置的

递归法:

这道题的第一个做法是,利用二叉搜索树的特点,我们直接使用中序遍历得到二叉搜索树节点的有序序列,判断这个有序序列是否是真的有序即可

以上做法的Java代码:

class Solution {
	private List<Integer> list;

	private void travel(TreeNode node) {
		if (node == null)
			return;
		travel(node.left);
		list.add(node.val);
		travel(node.right);
	}

	public boolean isValidBST(TreeNode root) {
		list = new ArrayList<>();
		travel(root);
		for (int i = 0; i < list.size() - 1; i++) {
			if (list.get(i) >= list.get(i + 1))
				return false;
		}
		return true;
	}
}

但其实我们也可以不将遍历结果转变为数组进行判断,可以在递归获取遍历序列的过程中直接进行判断是否有序。

以上做法的Java代码:

class Solution {
	TreeNode rnNode;//记录当前遍历到的节点
	public boolean isValidBST(TreeNode root) {
		if (root == null) return true;
		boolean left = isValidBST(root.left);
		if (rnNode != null && rnNode.val >= root.val) return false;
		rnNode = root;
		boolean right = isValidBST(root.right);
		return left && right;
	}
}

迭代法:

迭代法其实就是不用递归方法来遍历,而是改用一个栈来实现中序遍历,即迭代的方式,思路与上面的递归法是一样的,都是在中序遍历的过程中直接进行判断是否有序

以上做法的Java代码:

class Solution {
	public boolean isValidBST(TreeNode root) {
		TreeNode rnNode = null;// 记录当前中序遍历序列的最后一个节点
		TreeNode curNode = root;
		Deque<TreeNode> deque = new LinkedList<>();
		while (curNode != null || !deque.isEmpty()) {
			if (curNode != null) {
				deque.push(curNode);
				curNode = curNode.left;
			} else {
				curNode = deque.poll();
				if (rnNode != null && curNode.val <= rnNode.val)
					return false;
				rnNode = curNode;
				curNode = curNode.right;
			}
		}
		return true;
	}
}

http://www.niftyadmin.cn/n/1803114.html

相关文章

记录一个字符串出现的次数

首先定义一个计时器count 0&#xff0c;然后判断父字符串中是否有子字符串&#xff0c;如果没有则直接返回count 0&#xff0c;如果判断有&#xff0c;则定义一个变量index 0 记录子字符串key出现的位置&#xff0c;然后生成一个新的字符串对象 str 利用substring&#xff08…

14: curl#6 - Could not resolve host: mirrorlist.centos.org; 未知的错误

14: curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"One of the configured repositories failed (未知),and yum doesnt have enough cached data to continue. At this point the onlysafe thing yum can do is fail. There are a few ways…

十、JSTL标签库

l JSTL标签库&#xff08;重点&#xff09; l 自定义标签&#xff08;理解&#xff09; l MVC设计模式&#xff08;重点中的重点&#xff09; l Java三层框架&#xff08;重点中的重点&#xff09; JSTL标签库 1 什么是JSTL JSTL是apache对EL表达式的扩展&#xff08;也就是说…

LeetCode 501 二叉搜索树中的众数 -- 递归法和迭代法

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode-cn.com/problems/find-mode-in-binary-search-tree 题意&#xff1a; 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有…

Supervisord管理进程实践

今天凑空研究了下Supervisord&#xff0c;这是一款linux进程管理工具&#xff0c;使用python开发&#xff0c;主要用于在后台维护进程&#xff08;类似master守护进程&#xff09;&#xff0c;可以实现监控进程的状态、自动重启进程等操作&#xff0c;便于一些服务的维护与监控…

WSL记录

cmder&#xff08;mini版&#xff09;作为wsl的终端&#xff0c;很好用&#xff0c;可以split屏。但是&#xff1a;千万不要在settings里面设置start up(启动) 里面设置 命令行“bash -cur_console:p1”&#xff01;目前的cmder最新版已经够完美了&#xff0c;直接在settings/g…

LeetCode 236 二叉树的最近公共祖先 -- 递归法

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree 题意&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1…

LeetCode 669 修剪二叉搜索树 -- 递归法和迭代法

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode-cn.com/problems/trim-a-binary-search-tree 题意&#xff1a; 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得…