题目:
给你一个二叉树的根节点 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;}