それは有効な二分探索木(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
あなたは基本的に違いは間にあるものを求めています:
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