LeetCode:验证二叉搜索树【98】
题目描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入: 2 / 1 3 输出: true
示例 2:
输入: 5 / 1 4 / 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。
题目分析
二叉搜索树的中序遍历结果递增。我们只需要写一个中序遍历然后看一下结果是否递增即可。
其实我们也不需要把中序遍历结果全部弄出来,我们可以在递归的过程中,实时地比较当前元素和前一个元素的大小值关系,如果出现小于等于,则不是搜索树。
我们来分析一下二叉树中序遍历的迭代算法:
class Solution { public List<Integer> inorderTraversal(TreeNode node) { List<Integer> ans = new ArrayList<>(); if(node==null) return ans; Stack<TreeNode> stack = new Stack<>(); while (node!=null||!stack.empty()) { while (node!=null) { //while不成立时,到达最左下节点 stack.push(node); node = node.left; } if (!stack.empty()) { TreeNode tmp = stack.pop(); ans.add(tmp.val); //出栈并访问该节点 node = tmp.right; } } return ans; } }
先一直沿着“左孩子方向”不断地走,当走到了最左下结点时(while不成立),准备出栈,访问该结点。当出栈访问完该结点之后,切换到该结点的右孩子的“子树”中,回到大循环,与前面一样,继续对该“子树”先沿着“左孩子方向”不断地走....
Java题解
/** * 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) { List<Integer> list = new ArrayList<>(); inorder(root,list); for(int i=0;i<list.size()-1;i++) if(list.get(i)>=list.get(i+1)) return false; return true; } public void inorder(TreeNode node,List<Integer> list) { if(node==null) return; inorder(node.left,list); list.add(node.val); inorder(node.right,list); } }