publicbooleanisValidBST(TreeNode root){ List<Integer> res = new ArrayList<>(); //得到中序遍历序列 inorderTraversal(root,res); //检查序列是否严格升序 for (int i = 0; i < res.size()-1; i++) { if (res.get(i)>=res.get(i+1))returnfalse; } returntrue; }
privatevoidinorderTraversal(TreeNode root, List<Integer> res){ if (root==null)return; inorderTraversal(root.left,res); res.add(root.val); inorderTraversal(root.right,res); }
时间复杂度:O(n) 两次遍历,中序遍历一次,检查序列一次
思路二:中序遍历,一次遍历 其实没必要得到中序序列,在中序遍历的过程中直接进行大小比较即可。
1 2 3 4 5 6 7 8 9
TreeNode next = null;
publicbooleanisValidBST(TreeNode root){ if (root == null) returntrue; if (!isValidBST(root.left)) returnfalse; if (next != null && next.val >= root.val) returnfalse; next = root; return isValidBST(root.right); }
时间复杂度:O(n) 一次遍历
迭代实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
publicbooleanisValidBST(TreeNode root){ if (root==null)returntrue; Stack<TreeNode> stack=new Stack<>(); TreeNode next=null; while (root != null || !stack.isEmpty()) { while (root != null) { stack.push(root); root=root.left; } root=stack.pop(); if (next!=null&&next.val>=root.val)returnfalse; next=root; root=root.right; } returntrue; }