diff --git a/arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_1.py b/arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_1.py new file mode 100644 index 0000000..e313f4b --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_1.py @@ -0,0 +1,14 @@ +# DFS(再帰) +class Solution: + def isValidBST(self, root: Optional[TreeNode]) -> bool: + + def helper_valid_bst(node, min_val=-math.inf, max_val=math.inf): + if not node: + return True + if not min_val < node.val < max_val: + return False + return helper_valid_bst( + node.left, min_val, node.val + ) and helper_valid_bst(node.right, node.val, max_val) + + return helper_valid_bst(root) diff --git a/arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_2.py b/arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_2.py new file mode 100644 index 0000000..a65e401 --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_2.py @@ -0,0 +1,46 @@ +# DFS(再帰) +# 再帰部分の戻り値を変数に格納 +class Solution: + def isValidBST(self, root: Optional[TreeNode]) -> bool: + def helper_valid_bst(node, lower=-math.inf, upper=math.inf): + if not node: + return True + if not lower < node.val < upper: + return False + if not helper_valid_bst(node.left, lower, node.val): + return False + if not helper_valid_bst(node.right, node.val, upper): + return False + return True + + return helper_valid_bst(root) + + +# DFS(スタック) +class Solution: + def isValidBST(self, root: Optional[TreeNode]) -> bool: + node_range_stack = [(root, -math.inf, math.inf)] + while node_range_stack: + node, lower, upper = node_range_stack.pop() + if not node: + continue + if not lower < node.val < upper: + return False + node_range_stack.append((node.right, node.val, upper)) + node_range_stack.append((node.left, lower, node.val)) + return True + + +# BFS +class Solution: + def isValidBST(self, root: Optional[TreeNode]) -> bool: + node_range_queue = deque([(root, -math.inf, math.inf)]) + while node_range_queue: + node, lower, upper = node_range_queue.popleft() + if not node: + continue + if not lower < node.val < upper: + return False + node_range_queue.append((node.left, lower, node.val)) + node_range_queue.append((node.right, node.val, upper)) + return True diff --git a/arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_3.py b/arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_3.py new file mode 100644 index 0000000..fad965f --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_3.py @@ -0,0 +1,14 @@ +class Solution: + def isValidBST(self, root: Optional[TreeNode]) -> bool: + def helper_valid_bst(node, lower=-math.inf, upper=math.inf): + if not node: + return True + if not lower < node.val < upper: + return False + if not helper_valid_bst(node.left, lower, node.val): + return False + if not helper_valid_bst(node.right, node.val, upper): + return False + return True + + return helper_valid_bst(root)