判断BinaryTree是否为BinarySearchTree的O(N)算法

判断一个BinaryTree是否为BinarySearchTree 最直接的方法就是对于每个节点,遍历其所有子结点,判断是否左子树节点均小于根,并且右子树节点大于根。其复杂度为O(N^2),并且该方法需要用到非递归遍历来比较每一个节点和根,代码相对复杂。


根据BinarySearchTree的定义,根节点永远大于左子树,永远小于右子树。因此对于每个根的左子树节点,都限定了其最大值为根节点,右子树节点限定最小值为根节点。这样在每次遍历中,当访问左子树时,更新最大值为当前节点,访问右子树时,更新最小值为当前节点。当发现有节点不在限定范围内是返回false.


该算法前序遍历n个节点,复杂度O(N).


其中max和min使用了包装类integer。integer和int的主要区别在于int为java基本数据类型,integer为java为int型变量封装的类,在这里主要为了区别max和min是否赋值。int默认赋值为0,而integer未赋值为null。


public static boolean checkBST(Node n,Integer min,Integer max){
		if(n==null){
			return true;
		}
		else if((min!=null&&n.index<=min)||(max!=null&&n.index>=max)){
			return false;
		}
		else if((checkBST(n.left,min,n.index)==false)||(checkBST(n.right,n.index,max))==false){// update max when access left child, and update min when access right child
			return false;
		}
		else return true;
	}
	


你可能感兴趣的:(数据结构算法基础)