LeetCode初級算法--樹02:驗證二叉搜索樹

LeetCode初級算法--樹02:驗證二叉搜索樹

搜索微信公衆號:'AI-ming3526'或者'計算機視覺這件小事' 獲取更多算法、機器學習乾貨
csdn:https://blog.csdn.net/baidu_31657889/
csdn:https://blog.csdn.net/abcgkj/
github:https://github.com/aimi-cn/AILearnersnode

1、引子

這是由LeetCode官方推出的的經典面試題目清單~
這個模塊對應的是探索的初級算法~旨在幫助入門算法。咱們第一遍刷的是leetcode推薦的題目。
查看完整的劍指Offer算法題解析請點擊github連接:
github地址python

2、題目

給定一個二叉樹,判斷其是不是一個有效的二叉搜索樹。git

假設一個二叉搜索樹具備以下特徵:github

  • 節點的左子樹只包含小於當前節點的數。
  • 節點的右子樹只包含大於當前節點的數。
  • 全部左子樹和右子樹自身必須也是二叉搜索樹。

示例1:面試

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

示例2:算法

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

一、思路

  • 爲了驗證一棵樹是不是BST,咱們能夠一個節點一個節點的查看。
  • 每個節點都有一個最大值和最小值的範圍。
  • 哎?爲何一個節點有一個最大值和最小值的範圍?
  • 咱們舉個例子。
5
   / \
  1   8
     / \
    3   10

在上述的樹當中,1比5小,8比5大,第一層OK
再第二層,3比8小,10比8大,OK....OK嗎?
不OK!由於3在5的右子樹,應當比5大。
因此不能夠直觀地認爲一個節點只要比父節點大或者小就能夠了,它其實是由大小範圍的。
對於這個3,它應該的範圍就是(5,8)。
最大值和最小值怎麼更新呢?
很簡單,若是要檢查的節點在這個節點的左邊,那麼最大值就是這個節點的值,最小值就是上一輪檢查當中的最小值。
反之亦然。編程

二、編程實現

python微信

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    # 初始化root的時候,它沒有最大最小的限制
    def isValidBST(self, root: TreeNode, low = float('-inf'), high = float('inf')) -> bool:
        # 當這個節點不存在的時候,就返回True。就表明父節點沒有(左或右)孩子
        if not root:return True
        # 判斷當前節點是否大於最小值和小於最大值
        if not low<root.val<high:return False
        # 遞歸檢查左右孩子,兩個都爲True才能夠返回True
        return self.isValidBST(root.left,low,root.val) and self.isValidBST(root.right,root.val,high)

AIMI-CN AI學習交流羣【1015286623】 獲取更多AI資料機器學習

分享技術,樂享生活:咱們的公衆號計算機視覺這件小事每週推送「AI」系列資訊類文章,歡迎您的關注!學習

本文由博客一文多發平臺 OpenWrite 發佈!

相關文章
相關標籤/搜索