leetcode -- 98. Validate Binary Search Tree【假设法 + 局部性】

本文介绍了两种检查给定二叉树是否为有效二叉搜索树的方法。方法一使用中序遍历并检查节点值是否递增;方法二采用递归方式设定每个节点的有效范围。

题目

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

Example 1:

    2
   / \
  1   3
Binary tree [2,1,3], return true.

Example 2:

    1
   / \
  2   3
Binary tree [1,2,3], return false.


题意

给定一个二叉树,判断其是否是一个二叉搜索树(BST)。(注意:二叉搜索树定义)

分析及代码

方法1(假设法):

  • 假设】假设该树是二叉搜索树,那么中序遍历的结果,是从小到大排列。(排列顺序中,若不符合此要求,说明非二叉搜索树。)

public class Solution {
	List<TreeNode> orders  = new LinkedList<>();
	public boolean isValidBST(TreeNode root) {
		getTheOrder(root);
		for(int i =0;i <orders.size()-1;i++){
			if(orders.get(i).val >= orders.get(i+1).val){
				return false;
			}
		}
		return true;
	}
	public void getTheOrder(TreeNode root){
		if(root == null) return ;
		getTheOrder(root.left);
		orders.add(root);
		getTheOrder(root.right);
	}
}

方法2(局部边缘设定):

  • 局部边缘 】要想弄清边缘,就必须清楚二叉搜索树的定义。拿左子树的 left  结点举例,它一定时比root要小的(上界限制),意思也就是说其父节点构成紧密的限制。而于此同时,你也应该确定这个东西在没在某棵子树的右侧,最近的为下界
  • 【举例】 2的上界 为3, 下界为1.(上界,下界 都是是最近的

    1
     \
      3
     /
    2

public class Solution {

    public boolean isValidBST(TreeNode root) {
        return isValidBSTHelper(root, null, null);
    }

    private boolean isValidBSTHelper(TreeNode root, Integer leftBound, Integer rightBound) {
        // recursively pass left and right bounds from higher level to lower level
        if (root == null) {
            return true;
        }
        if (leftBound != null && root.val <= leftBound || rightBound != null && root.val >= rightBound) {
            return false;
        }
        return isValidBSTHelper(root.left, leftBound, root.val) && isValidBSTHelper(root.right, root.val, rightBound);
    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值