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