2.判断一棵树是搜索二叉树

首先,搜索二叉树可以从中序遍历的角度去考虑,中序遍历的值是严格的单调递增的时候,我们就认为它是一课搜索二叉树。(一般搜索二叉树里面没有相等的值,所以不必在意)

1.可以利用中序遍历递归方法,不打印遍历结果,只是把遍历的内容保存下来,之后再进行遍历结果的判断,看是不是递增的。

public class Main {
	
	public static boolean isSearchBTree(TreeNode root) {
		ArrayList<Integer> list = new ArrayList<>();
		convertBTreeToList(root, list);
		if(list.size() <=1)return true;
		for(int i = 1; i < list.size();i++){
			if(list.get(i)<list.get(i-1))
				return false;
		}
		return true;
	}
	public static void convertBTreeToList(TreeNode root, ArrayList<Integer> list) {
		if(root == null)return;
		if(root.left != null)convertBTreeToList(root.left, list);
		list.add(root.val);
		if(root.right != null)convertBTreeToList(root.right, list);
	}
	public static void  main(String[] args) {
		TreeNode node2 = new TreeNode(4, null, null);
		TreeNode node1 = new TreeNode(1, null, node2);
		TreeNode node = new TreeNode(3, node1, null);
		System.out.println(isSearchBTree(node));
	}
}

2.上一中方法要先遍历整个树,可以在递归中记录下上一个数,和接下来要打印的数,两两比较,可以大大节省效率和空间,如果出现不符合中序递增的就立即返回false

public class Main {
	static int lastNodeValue = Integer.MIN_VALUE;
	public static boolean isSearchBTree(TreeNode root) {
		if(root == null)return true;
		if(!isSearchBTree(root.left))return false ;
		if(root.val<=lastNodeValue)return false;
		lastNodeValue = root.val;
		if(!isSearchBTree(root.right))return false ;
		return true;
	}
	public static void  main(String[] args) {
		TreeNode node2 = new TreeNode(6, null, null);
		TreeNode node1 = new TreeNode(1, null, node2);
		TreeNode node = new TreeNode(3, node1, null);
		System.out.println(isSearchBTree(node));
	}
}

猜你喜欢

转载自blog.csdn.net/yysave/article/details/83035908