天天看點

[leetcode]98. 驗證二叉搜尋樹

  • 個人部落格:https://javaniuniu.com/
  • 難度:

    中等

  • 本題涉及算法:

    中序周遊

  • 思路:
  • 類似題型:
  • 知識點參考: 二叉樹(前序,中序,後序,層序)周遊遞歸與循環的python實作

題目 98. 驗證二叉搜尋樹

給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。

假設一個二叉搜尋樹具有如下特征:

  • 節點的左子樹隻包含 小于 目前節點的數。
  • 節點的右子樹隻包含 大于 目前節點的數。
  • 所有左子樹和右子樹自身必須也是二叉搜尋樹。

示例 1:

輸入:
    2
   / \
  1   3
輸出: true
           

示例 2:

輸入:
    5
   / \
  1   4
     / \
    3   6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
     根節點的值為 5 ,但是其右子節點值為 4 。
           

方法一

解題思路

  • 中序周遊時,判斷目前節點是否大于中序周遊的前一個節點,如果大于,說明滿足 BST,繼續周遊;否則直接傳回 false。

java

class Solution {
    long pre = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        if (root == null) {
            return true;
        }
        // 通路左子樹
        if (!isValidBST(root.left)) {
            return false;
        }
        // 通路目前節點:如果目前節點小于等于中序周遊的前一個節點,說明不滿足BST,傳回 false;否則繼續周遊。
        if (root.val <= pre) {
            return false;
        }
        pre = root.val;
        // 通路右子樹
        return isValidBST(root.right);
    }
}
           

python

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
# 中序周遊 : 按照 左 中 右 的順序 挨個周遊
class Solution:
    cur = float("-inf")
    def isValidBST(self, root: TreeNode) -> bool:
        if root is None:
            return True
        # 通路左子樹
        if  not self.isValidBST(root.left):
            return False
        # 通路目前節點:如果目前節點小于等于中序周遊的前一個節點,說明不滿足BST,傳回 false;否則繼續周遊。
        if (root.val <= self.cur):
            return False
        self.cur = root.val
        # 通路右子樹
        return self.isValidBST(root.right)