面试题 04.05. 合法二叉搜索树 【中等题】【中序遍历】
实现一个函数,检查一棵二叉树是否为二叉搜索树。
输入:
2
/ \
1 3
输出: true
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
题目讲解
解法1:迭代解法
【核心思想】
- 判断中序遍历是否是递增的
- 用栈实现中序遍历
【数据结构】
- 栈
【思路】
- 将树的左子树依次存入
stack
- 每次
pop
出一个TreeNode
,判断其是否大于之前的数 - 将其右子树的左子树也依次存入
stack
【代码】
public boolean isValidBST(TreeNode root) {
long pre=Long.MIN_VALUE;
Stack<TreeNode> stack=new Stack<>();
while (root != null) {
stack.push(root);
root=root.left;
}
while(!stack.empty()){
TreeNode temp=stack.pop();
if(temp.val<=pre)
return false;
pre=temp.val;
if(temp.right!=null){
TreeNode r=temp.right;
while(r!=null){
stack.push(r);
r=r.left;
}
}
}
return true;
}
【备注】
- 这边用
long
的数据类型,是因为有以下一个特殊的测试用例
解法2:递归解法
【核心思想】
- 判断中序遍历是否是递增的
- 用递归实现中序遍历
【思路】
- 全局保存前一个数
pre
和判断指标flag
- 先递归左子树
- 判断是否大于
pre
- 再递归右子树
【代码】
long pre;
boolean flag;
public boolean isValidBST(TreeNode root) {
if (root==null) return true;
pre = Long.MIN_VALUE;
flag = true;
help(root);
return flag;
}
void help(TreeNode root) {
if (root == null || !flag) return;
help(root.left);
if (root.val > pre)
pre = root.val;
else
flag = false;
help(root.right);
}
【备注】
- 这边用
long
的数据类型,是因为有以下一个特殊的测试用例
关注微信公众号“算法岗从零到无穷”,更多算法知识点告诉你。