问题链接
判断是否有效搜索二叉树
深度优先搜索
递归解决方案
class Solution {
public boolean isValidBST(TreeNode root) {
if(root == null) return true;
return helper(root, null,null);
}
//low 表示 当前节点应该满足的最小阈值,high表示当前节点应该满足的最大阈值
boolean helper(TreeNode root, Integer low, Integer high)
{
if(low != null && root.val <= low) return false;
if(high != null && root.val >= high) return false;
boolean ans1=true,ans2 = true;
if(root.left != null) ans1 = helper(root.left,low,root.val);
if(root.right != null) ans2 = helper(root.right,root.val,high);
return ans1&&ans2;
}
}
迭代解决方案
利用LinkedList实现DFS, LinkedList类的poll方法为弹出链表的第一个值,arraylist没有这种方法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
if(root == null) return true;
LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
LinkedList<Integer> low = new LinkedList<Integer>();
LinkedList<Integer> high = new LinkedList<Integer>();
stack.add(root);
low.add(null);
high.add(null);
while(!stack.isEmpty())
{
root = stack.poll();
//当前node应该满足的最小值
Integer lo = low.poll();
//当前node应该满足的最大值
Integer hi = high.poll();
if(lo != null && root.val <= lo) return false;
if(hi != null && root.val >= hi) return false;
//当前左节点并不是没有下界的,父节点的下界可以传递到子节点
if(root.left != null)
{
stack.add(root.left);
low.add(lo);
high.add(root.val);
}
if(root.right != null)
{
stack.add(root.right);
low.add(root.val);
high.add(hi);
}
}
return true;
}
}