首页 > 其他 > 详细

Tree_Graph Validate Binary Search Tree 检测一个BST是否有效 @CareerCup

时间:2014-03-04 04:08:56      阅读:703      评论:0      收藏:0      [点我收藏+]

Implement a function to check if a binary tree is a binary search tree

判断一个二叉树是否是BST


思路:

1)中序遍历二叉树,把结果放在一个数组里。然后判断这个数组是否递增

2)在上一种方法的基础上优化,无需用到数组。在中序遍历时与上一个数比较,判断是否恒递增

3)我最喜欢的方法:min max的方法,限定每一个元素的上下限,如果超出范围则为false

参考LeetCode原题:http://blog.csdn.net/fightforyourdream/article/details/14444883


package Tree_Graph;

import CtCILibrary.TreeNode;

public class S4_5 {

	// =============================== checkBST 方法1,中序遍历建数组
	public static int index = 0;
	
	public static boolean checkBST(TreeNode root, int size) {
		int[] A = new int[size];
		copyBST(root, A);
		for(int i=1; i<A.length; i++) {
			if (A[i] <= A[i-1]) {
				return false;
			}
		}
		return true;
	}
	
	public static void copyBST(TreeNode root, int[] A) {
		if (root == null) {
			return;
		}
		
		copyBST(root.left, A);
		A[index++] = root.data;
		copyBST(root.right, A);
	}
	
	
	// =============================== checkBST 方法2,中序遍历但仅保留last变量
	public static int last = Integer.MIN_VALUE;
	
	public static boolean checkBST2(TreeNode root) {
		if(root == null) {
			return true;
		}
		
		if( !checkBST2(root.left) ) {		// 检测左子树
			return false;
		}
		if(root.data <= last) {				// 检查当前节点,如果有序则必然比last大
			return false;
		}
		last = root.data;						// 更新last节点
		
		if( !checkBST2(root.right) ) {		// 检查右子树
			return false;
		}
		
		return true;
	}
	
	
	
	// =============================== checkBST 方法3,Min-Max
	// Time: O(N), space: O(logN)
	public static boolean checkBST3(TreeNode root) {
		return checkBSTRec(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
	}
	
	public static boolean checkBSTRec(TreeNode root, int min, int max) {
		if (root == null) {
			return true;
		}
		// 当前节点非BST
		if(root.data<=min || root.data>max) {
			return false;
		}
		
		// 左子树或者右子树非BST
		if( !checkBSTRec(root.left, min, root.data) || !checkBSTRec(root.right, root.data, max)) {
			return false;
		}
		
		return true;
	}
	
	
	public static void main(String[] args) {
		int[] array = {3, 5, 6, 10, 13, 15};
//		int[] array = {3, 5, 6};
		TreeNode node = TreeNode.createMinimalBST(array);
		node.print();
		System.out.println(checkBST(node, array.length));
		System.out.println(checkBST2(node));
		System.out.println(checkBST3(node));
	}
	
}







Tree_Graph Validate Binary Search Tree 检测一个BST是否有效 @CareerCup,布布扣,bubuko.com

Tree_Graph Validate Binary Search Tree 检测一个BST是否有效 @CareerCup

原文:http://blog.csdn.net/fightforyourdream/article/details/20356253

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!