From fe6831f51feed36269915933e95aab69777c1544 Mon Sep 17 00:00:00 2001 From: shining-ai Date: Sun, 17 Mar 2024 13:47:46 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=E3=80=90Arai60=E3=80=9128=E5=95=8F?= =?UTF-8?q?=E7=9B=AE=2098.=20Validate=20Binary=20Search=20Tree?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../level_1.py | 14 ++++++ .../level_2.py | 45 +++++++++++++++++++ .../level_3.py | 12 +++++ 3 files changed, 71 insertions(+) create mode 100644 arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_1.py create mode 100644 arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_2.py create mode 100644 arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_3.py 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..3935193 --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_2.py @@ -0,0 +1,45 @@ +# 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 + is_left_valid = helper_valid_bst(node.left, min_val, node.val) + is_right_valid = helper_valid_bst(node.right, node.val, max_val) + return is_left_valid and is_right_valid + + 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, min_val, max_val = node_range_stack.pop() + if not node: + continue + if not min_val < node.val < max_val: + return False + node_range_stack.append((node.right, node.val, max_val)) + node_range_stack.append((node.left, min_val, 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, min_val, max_val = node_range_queue.popleft() + if not node: + continue + if not min_val < node.val < max_val: + return False + node_range_queue.append((node.left, min_val, node.val)) + node_range_queue.append((node.right, node.val, max_val)) + 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..dacca84 --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/28_98_Validate Binary Search Tree/level_3.py @@ -0,0 +1,12 @@ +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 + is_left_valid = helper_valid_bst(node.left, min_val, node.val) + is_right_valid = helper_valid_bst(node.right, node.val, max_val) + return is_left_valid and is_right_valid + + return helper_valid_bst(root) From 1ee1c750637b0885fe064c002c6a07a87f94f912 Mon Sep 17 00:00:00 2001 From: shining-ai Date: Sun, 17 Mar 2024 14:13:21 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=82=92=E8=AA=AD=E3=81=BF=E7=9B=B4=E3=81=97=E3=81=A6=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../28_98_Validate Binary Search Tree/level_2.py | 9 +++++---- .../28_98_Validate Binary Search Tree/level_3.py | 8 +++++--- 2 files changed, 10 insertions(+), 7 deletions(-) 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 index 3935193..4fc4b3d 100644 --- 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 @@ -2,15 +2,16 @@ # 再帰部分の戻り値を変数に格納 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 - is_left_valid = helper_valid_bst(node.left, min_val, node.val) - is_right_valid = helper_valid_bst(node.right, node.val, max_val) - return is_left_valid and is_right_valid + if not helper_valid_bst(node.left, min_val, node.val): + return False + if not helper_valid_bst(node.right, node.val, max_val): + return False + return True return helper_valid_bst(root) 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 index dacca84..ee39d17 100644 --- 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 @@ -5,8 +5,10 @@ def helper_valid_bst(node, min_val=-math.inf, max_val=math.inf): return True if not min_val < node.val < max_val: return False - is_left_valid = helper_valid_bst(node.left, min_val, node.val) - is_right_valid = helper_valid_bst(node.right, node.val, max_val) - return is_left_valid and is_right_valid + if not helper_valid_bst(node.left, min_val, node.val): + return False + if not helper_valid_bst(node.right, node.val, max_val): + return False + return True return helper_valid_bst(root) From bc481c3229364341c01feac86f76c1287c4c0fd2 Mon Sep 17 00:00:00 2001 From: shining-ai Date: Sun, 17 Mar 2024 14:21:37 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BB=96=E3=81=AE=E4=BA=BA=E3=81=AE?= =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=82=92=E8=A6=8B=E3=81=A6?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../level_2.py | 24 +++++++++---------- .../level_3.py | 8 +++---- 2 files changed, 16 insertions(+), 16 deletions(-) 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 index 4fc4b3d..a65e401 100644 --- 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 @@ -2,14 +2,14 @@ # 再帰部分の戻り値を変数に格納 class Solution: def isValidBST(self, root: Optional[TreeNode]) -> bool: - def helper_valid_bst(node, min_val=-math.inf, max_val=math.inf): + def helper_valid_bst(node, lower=-math.inf, upper=math.inf): if not node: return True - if not min_val < node.val < max_val: + if not lower < node.val < upper: return False - if not helper_valid_bst(node.left, min_val, node.val): + if not helper_valid_bst(node.left, lower, node.val): return False - if not helper_valid_bst(node.right, node.val, max_val): + if not helper_valid_bst(node.right, node.val, upper): return False return True @@ -21,13 +21,13 @@ class Solution: def isValidBST(self, root: Optional[TreeNode]) -> bool: node_range_stack = [(root, -math.inf, math.inf)] while node_range_stack: - node, min_val, max_val = node_range_stack.pop() + node, lower, upper = node_range_stack.pop() if not node: continue - if not min_val < node.val < max_val: + if not lower < node.val < upper: return False - node_range_stack.append((node.right, node.val, max_val)) - node_range_stack.append((node.left, min_val, node.val)) + node_range_stack.append((node.right, node.val, upper)) + node_range_stack.append((node.left, lower, node.val)) return True @@ -36,11 +36,11 @@ class Solution: def isValidBST(self, root: Optional[TreeNode]) -> bool: node_range_queue = deque([(root, -math.inf, math.inf)]) while node_range_queue: - node, min_val, max_val = node_range_queue.popleft() + node, lower, upper = node_range_queue.popleft() if not node: continue - if not min_val < node.val < max_val: + if not lower < node.val < upper: return False - node_range_queue.append((node.left, min_val, node.val)) - node_range_queue.append((node.right, node.val, max_val)) + 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 index ee39d17..fad965f 100644 --- 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 @@ -1,13 +1,13 @@ class Solution: def isValidBST(self, root: Optional[TreeNode]) -> bool: - def helper_valid_bst(node, min_val=-math.inf, max_val=math.inf): + def helper_valid_bst(node, lower=-math.inf, upper=math.inf): if not node: return True - if not min_val < node.val < max_val: + if not lower < node.val < upper: return False - if not helper_valid_bst(node.left, min_val, node.val): + if not helper_valid_bst(node.left, lower, node.val): return False - if not helper_valid_bst(node.right, node.val, max_val): + if not helper_valid_bst(node.right, node.val, upper): return False return True