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)); } }


猜你喜欢

转载自blog.csdn.net/weixin_30363263/article/details/80181628