leetcode题目 98. 验证二叉搜索树

题目

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

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

示例

示例 1:

输入:
   2
  /   \
1     3
输出: true

示例 2:

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

思路

as we all know,二叉搜索树的排列顺序其实就是中序遍历的顺序,那么我们只需要进行中序遍历,每访问一个节点,判断节点是否大于它的前驱节点,大于则继续遍历并重新赋值前驱节点的值,否则返回false。注意:前驱节点的值要么使用静态变量,要么使用数组进行传参,必须保证它在全局中是相同的,它的作用范围是全局。实在不知道为什么,带入[1,1]和[1,null,1]走一遍程序即可。

代码

/*
 * 验证二叉搜索树
 */
public class problem98 {
	public static class TreeNode {
		int val;
		TreeNode left;
		TreeNode right;

		TreeNode(int x) {
			val = x;
		}
	}

	public boolean isValidBST(TreeNode root) {
		//必须用long.MIN_VALUE,且必须用数组,数组可以然pre在全局通用
		//使用Long的原因是避免与val的值重复,val的值是int类型,使用long就可以避免
		long te[]={Long.MIN_VALUE};
		return inOrder(root, te);
	}

	//中序遍历
	public boolean inOrder(TreeNode node, long[] pre) {
		if (node == null)
			return true;
		
		if (!inOrder(node.left, pre))
			return false;
		
		if (pre[0] >= node.val)
			return false;
		
		pre[0] = node.val;
		
		if (!inOrder(node.right, pre))
			return false;

		return true;
	}

	public static void main(String[] args) {
		problem98 pro = new problem98();
		TreeNode a = new TreeNode(1);
		a.left = new TreeNode(1);
		System.out.println(pro.isValidBST(a));
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值