题目:
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
思路:二叉搜索树的中序遍历结果是一个递增数组,可以根据这个性质来解题。
递归法,迭代法的中序遍历均可。需注意的是不能判断左节点<中节点<右节点就是二叉搜索树,而是左子树是二叉搜索树,右子树也是二叉搜索树,同时左节点<中节点<右节点才是二叉搜索树。
递归代码:
TreeNode max;//记录最大节点
public boolean isValidBST(TreeNode root) {
if(root==null) return true;
//左子树
boolean left=isValidBST(root.left);
if(!left) return false;
//中节点
if(max!=null&&max.val>=root.val)//中序遍历,max存储的是左子树的最大节点
return false;
max=root;//更新max
//右子树
boolean right=isValidBST(root.right);
return right;//左子树和中节点都没问题,判断右子树即可
}
迭代代码:
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> stack=new Stack<>();
TreeNode pre=null;//记录正在处理的节点的中序遍历顺序的前一个值
if(root!=null)
stack.add(root);
while(!stack.isEmpty()){
TreeNode node=stack.peek();
if(node!=null){
stack.pop();
if(node.right!=null)
stack.add(node.right);
stack.add(node);
stack.add(null);//标记,node已访问但未处理
if(node.left!=null)
stack.add(node.left);
}
else{
stack.pop();//弹出null节点
TreeNode tmp=stack.pop();//处理已访问未处理的节点
if(pre!=null&&pre.val>=tmp.val) return false;
pre=tmp;
}
}
return true;
}