検証バイナリ検索ツリー

ビジェイ・ラジャ:

それは有効な二分探索木(BST)であれば、バイナリツリーを考えると、決定します。

次のようにBSTが定義されていると想定します。

ノードの左サブツリーが少ないノードのキーよりもキーでノードのみが含まれています。ノードの右部分木は、ノードのキーより大きいキーを持つノードのみが含まれています。左と右のサブツリーどちらも二分探索木でなければなりません。

Example 1:

    2
   / \
  1   3

Input: [2,1,3]
Output: true
Example 2:

    5
   / \
  1   4
     / \
    3   6

Input: [5,1,4,null,null,3,6]
Output: false
Explanation: The root node's value is 5 but its right child's value is 4.

私のコード:

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

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:



        def helper(node, lower = float('-inf'), upper = float('inf')):
            if(not node):
                return True

            if(node.val<=lower or node.val>=upper):
                return False
            if not helper(node.right, node.val, upper):
                return False
            if not helper(node.left, lower, node.val):
                return False
            return True


        return helper(root)

上記のコードは、すべてのテストケースに適しています。ただし、以下のコードはしていません。

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

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:



        def helper(node, lower = float('-inf'), upper = float('inf')):
            if(not node):
                return True

            if(node.val<=lower or node.val>=upper):
                return False
            helper(node.right, node.val, upper)
            helper(node.left, lower, node.val)
            return True


        return helper(root)

条件IF余分の必要性は何ですか?でも彼らなしで、機能は右下の場合の条件からfalseを返す必要がありますか?私はここで何をしないのですか?

 if(node.val<=lower or node.val>=upper):
                    return False
paxdiablo:

あなたは基本的に違いは間にあるものを求めています:

if not helper(node.right, node.val, upper):
    return False
if not helper(node.left, lower, node.val):
    return False
return True

そして:

helper(node.right, node.val, upper)
helper(node.left, lower, node.val)
return True

最初のチェックからの戻り値helper呼び出しとサブツリーがBSTでない場合は偽を返し、適切に作用します。第二チェックサブツリーは、どんなtrueを返すありません。


これは重要。有効なBSTの定義は、それがrootより大きく、root.leftかつより少ないroot.right、との両方のことをroot.leftしてroot.rightいるにも有効分探索木。

これらの戻り値を無視することによって、あなたがチェックしている唯一のことは、有効なBSTのトップという3つのノードです。言い換えれば、これはどこにもされていないにも関わらず、通過する付近で有効:

    __4__
   /     \
  2       8
 / \     / \
3   1   9   7

で結果を返さず、すべての再帰のレベル、あなたは基本的にそれを失います。

あなたがコメントで提起された問題と類似している以下のコードを、考えてみましょう(「?しかし、ヘルパー関数の内部で、それはここに遊びに来ていませんどのように偽の右を返すかの条件がありますか?」):

def level2():
    return 42          # Returns '42'.

def level1():
    level2()           # Returns 'None', not '42'.

print(level1())        # Prints 'None'.

このプリントはNone、以来、あなたは返すにもかかわらず、42レベル1で捨てていますレベル2、で。

正しい方法は変わってしまうlevel2()に電話をreturn level2()


余談として、私はあなたから取得しているどのような値はわからないupperし、lowerここに。

有効手段の再帰的な定義があることだけあなたがチェックする必要がある事は3つの即時ノードとサブツリーです。

換言すれば、これは(それがあっても、擬似コード十分で見えるのPython、後者は前者のための理想的なベースラインのような)

def isValidBst(node):
    # Empty tree is valid (or sub-tree, for that matter
    # but, since we never descend into a null, that's a
    # moot point).

    if node is null: return true

    # Check left value and sub-tree.

    if node.left is not null:
        if node.left.value >= node.value: return false
        if not isValidBst(node.left): return false

    # Check left value and sub-tree.

    if node.right is not null:
        if node.right.value <= node.value: return false
        if not isValidBst(node.right): return false

    # If there were no failures, including the possibility
    # we're at a leaf node, everything below this node is
    # okay.

    return true

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=275914&siteId=1