实现一个函数,检查一棵二叉树是否为二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
分析:
方法1:中序遍历+List集合
二叉搜索树各个节点值满足 左子树 < 根节点 < 右子树,因此中序遍历的结果一定是升序排序的,所以只需要创建一个 List 集合存储遍历到根节点时的值,然后判断集合是否升序即可。
时间复杂度:O(n) n 为节点数,因为还要判断升序,实际应该为 O(2n)
空间复杂度:O(n)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//创建List集合存储遍历结果
List<Integer> list = new ArrayList<>();
public boolean isValidBST(TreeNode root) {
//中序遍历
recur(root);
//遍历List集合,判断是否递增
for(int i = list.size()-1; i > 0; --i){
//不是递增
if(list.get(i) <= list.get(i-1)){
return false;
}
}
return true;
}
public void recur(TreeNode root){
//空节点
if(root == null){
return;
}
//遍历左子树
recur(root.left);
//记录根值
list.add(root.val);
//遍历右子树
recur(root.right);
}
}
方法2:中序遍历
方法1 要单独判断一次升序,实际上只需要记录前一个节点,然后当前节点值和上个节点值比较即可。
时间复杂度:O(n) n 为节点数
空间复杂度:O(n)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//记录上一节点值
Integer pre = null;
public boolean isValidBST(TreeNode root) {
//空节点
if(root == null){
return true;
}
//遍历左子树
if(!isValidBST(root.left)){
return false;
}
//与上一值比较
if(pre != null && root.val <= pre){
return false;
}
pre = root.val;
//遍历右子树
if(!isValidBST(root.right)){
return false;
}
return true;
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/legal-binary-search-tree-lcci