LeetCode: isValidBST(两种方法实现)

题目描述


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.


confused what"{1,#,2,3}"means? > read more on how binary tree is serialized on OJ.


OJ's Binary Tree Serialization:

The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.

判断一颗二叉树是否为二叉查询树

思路1、对其可以用中序遍历来判断是否为BST,中序遍历需要借助栈来实现,对于空的处理,也是返回True(非递归)

思路2、标准就是看每一个节点是否满足:1、左节点及以下节点的值比它小;2、右节点及以下节点的值比它大。当然,前提是子节点都存在的情况。所以,我们需要从根节点不断向下递归,只要所有节点都满足,那么就是BST,否则,就不是。(递归实现)

注意:

我们可以不用每次都去查找最大值和最小值,每次向下递归时,我们只要把该节点的值, 作为一个最大值, 传给它的左节点,也就是左边所有节点的值都要比它小;并且把它的值,作为最小值,传给它的右节点,也就是右边所有节点的值都要比它大。每次向下走,分别更新最大值和最小值即可。

import java.util.Stack;  //方法一
public class ValidBST {
	public static boolean isValidBST(TreeNode root){
		if(root==null) return true;
		Stack<TreeNode>  st=new Stack<TreeNode>();
		TreeNode pre=null;
		TreeNode cur=root;
		while(!st.isEmpty() ||cur != null) {
			if(cur==null) {
				cur=st.pop();
				if (pre != null && pre.val >= cur.val)//判断左结点和根结点的关系
                    return false;
                	pre = cur;//现在结点成为前面的结点
                	cur = cur.right;//遍历其右面的结点
			}
			else {
				 
                st.push(cur);//接着入栈
                cur = cur.left;//左结点进栈
            }
		}
		 return true;
	} 
	public static void main(String[] args) {
		TreeNode root=new TreeNode(6);
		TreeNode node1=new TreeNode(1);
		TreeNode node2=new TreeNode(8);
		root.left=node1;
		root.right=node2;
		ValidBST rl=new ValidBST();
		
		System.out.println(rl.isValidBST(root));
	}
}
//方法二
public class ValidBST {
        public static boolean isBSTHelper(TreeNode p, int low, int high) { if (p == null) return true; if (low < p.val && p.val < high) return isBSTHelper(p.left, low, p.val) && isBSTHelper(p.right, p.val, high); else return false; } public static final int INT_MIN = 0x80000000;public static final int INT_MAX= 0x7fffffff;//定义一下public static boolean isBST(TreeNode root) { return isBSTHelper(root, INT_MIN, INT_MAX); } public static void main(String[] args) {TreeNode root=new TreeNode(6);TreeNode node1=new TreeNode(1);TreeNode node2=new TreeNode(8);root.left=node1;root.right=node2;ValidBST rl=new ValidBST();System.out.println(rl.isBST(root)); } }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值