Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode-合法二叉搜索树
实现一个函数,检查一棵二叉树是否为二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
二、思路分析:
思路一:
中序遍历,判断是否递增
思路二:
记录最大最小值,根据BST定义判断左右子树是否均满足即可
思路三:
递归
三、AC 代码:
思路一:
class Solution {
long maxValue = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
if (isValidBST(root.left)) {
if (root.val <= maxValue) {
return false;
}
maxValue = root.val;
return isValidBST(root.right);
}
return false;
}
}
思路二:
class Solution {
public boolean isValidBST(TreeNode root) {
return dfs(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean dfs(TreeNode rootNode, long minValue, long maxValue) {
if (rootNode == null) {
return true;
}
if (rootNode.val >= maxValue || rootNode.val <= minValue) {
return false;
}
return dfs(rootNode.left, minValue, rootNode.val) && dfs(rootNode.right, rootNode.val, maxValue);
}
思路三:
class Solution {
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
if (root.left == null && root.right == null) {
return true;
}
return root.val > getMaxNode(root.left) && root.val < getMinNode(root.right)
&& isValidBST(root.left) && isValidBST(root.right);
}
public double getMaxNode(TreeNode rootNode) {
if (rootNode == null) {
return -Double.MAX_VALUE;
}
if (rootNode.right == null) {
return rootNode.val;
}
return getMaxNode(rootNode.right);
}
public double getMinNode(TreeNode rootNode) {
if (rootNode == null) {
return Double.MAX_VALUE;
}
if (rootNode.left == null) {
return rootNode.val;
}
return getMinNode(rootNode.left);
}
}
四、总结:
中序遍历:
二叉搜索树的特性之一就是中序遍历是升序。
那么在中序遍历的过程中,如果非升序的情况出现直接返回false。
定义pre指针,来存放中序遍历过程中的,上一个节点的地址。
DFS递归:
二叉搜索树的特点: 左 < 根 < 右
那么在遍历的过程中,把当前节点的左右边界找出来,只要超出边界情况,直接返回false