package com.interview.algorithms.tree; import com.interview.basics.model.tree.BinaryTree; import com.interview.basics.model.tree.BinaryTreeNode; import java.util.Iterator; /** * Created_By: stefanie * Date: 14-7-16 * Time: 下午10:14 */ public class C5_5_BSTProver<T extends Comparable> { public boolean isBST(BinaryTree<T> tree){ AddListProcessor p = new AddListProcessor(); C5_1_TreeTraverse.traverseByInOrder(tree.getRoot(), p); Iterator<T> itr = p.list.iterator(); T current = itr.next(); while(itr.hasNext()){ if(current.compareTo(itr.next()) > 0) return false; } return true; } private T lastVal = null; public boolean isValidBST(BinaryTree<T> tree){ this.lastVal = null; return isValidBST(tree.getRoot()); } public boolean isValidBST(BinaryTreeNode<T> node) { if (node == null) return true; if (!isValidBST(node.left)) return false; if (lastVal != null && lastVal.compareTo(node.value) >= 0) return false; lastVal = node.value; if (!isValidBST(node.right)) return false; return true; } public boolean isValidBSTMinMax(BinaryTreeNode<T> node){ if(node == null) return true; if(!isValidBSTMinMax(node.left)) return false; if(!isValidBSTMinMax(node.right)) return false; if((node.left != null && max(node.left).compareTo(node.value) >= 0 ) || (node.right != null && min(node.right).compareTo(node.value) <= 0)) return false; return true; } private T max(BinaryTreeNode<T> node){ if(node.right == null) return node.value; return max(node.right); } private T min(BinaryTreeNode<T> node){ if(node.left == null) return node.value; return min(node.left); } }