iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
Software Development

闖進Python異世界系列 第 28

[Day 28] 闖進Python異世界 - Valid BST

  • 分享至 

  • xImage
  •  

今天的目標是判斷一個二元搜尋樹是否合法?(Hackerrank 上的 Is this a Binary Search Tree ? )

二元搜尋樹不同於二元樹的地方是:
二元搜尋樹的構造須根據資料內容來放置,即根節點資料大於左子樹的任意節點資料,且小於右子樹的任意節點資料


那我們就直接從定義下手這個函式實作!
大概的想法是我們不斷縮小 root.data 的合法範圍,再搭配遞迴將二元樹分成無數個子樹!

def check_binary_search_tree_(root):
    return helper(root, float("-inf"), float("inf"))

def helper(root, _min, _max):
    if root is None:
        return True
    if root.data <= _min or root.data >= _max: #invalid
        return False
    # 分割成左、右子樹
    return helper(root.left, _min, root.data) & helper(root.right, root.data, _max)

第二種方式是利用之前學過的 Inorder Traversal 來實作
因為二元搜尋樹使用 Inorder Traversal 得出的結果恰好是一串嚴格遞增的數

def check_binary_search_tree_(root):
    temp = []
    helper(root, temp)
    for i in range(1, len(temp)):
        if temp[i] <= temp[i-1]:
            return False
    return True
    
def helper(root, temp): # inorder traversal
    if root is None:
        return None
    if root.left != None:
        helper(root.left, temp)
    temp.append(root.data)
    if root.right != None:
        helper(root.right, temp)

沒想到這個題目也可以這麼有趣吧!


上一篇
[Day 27] 闖進Python異世界 - Level Order Traversal of BST
下一篇
[Day 29] 闖進Python異世界 - Lowest Common Ancestor
系列文
闖進Python異世界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言