题目描述
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)); } }