98.Validate Binary Search Tree === ###### tags: `Medium`,`Tree`,`Binary Tree`,`DFS`,`Binary Search Tree` [98. Validate Binary Search Tree](https://leetcode.com/problems/validate-binary-search-tree/) ### 題目描述 Given the `root` of a binary tree, *determine if it is a valid binary search tree (BST)*. A **valid BST** is defined as follows: * The left subtree of a node contains only nodes with keys **less than** the node's key. * The right subtree of a node contains only nodes with keys **greater than** the node's key. * Both the left and right subtrees must also be binary search trees. ### 範例 **Example 1:** ![](https://assets.leetcode.com/uploads/2020/12/01/tree1.jpg) ``` Input: root = [2,1,3] Output: true ``` **Example 2:** ![](https://assets.leetcode.com/uploads/2020/12/01/tree2.jpg) ``` Input: root = [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. ``` **Constraints**: * The number of nodes in the tree is in the range [1, 10^4^]. * -2^31^ <= `Node.val` <= 2^31^ - 1 ### 解答 #### Python 醜哭 recursive. ```python= class Solution: def isValidBST(self, root: Optional[TreeNode]) -> bool: def recursive(root): print(root.val) if root.left == None and root.right == None: return (True, root.val, root.val) elif root.left != None and root.right == None: (T, left_max, left_min) = recursive(root.left) if T == False: return (False,-1,-1) elif left_max >= root.val: return (False,-1,-1) else: return (True, root.val, left_min) elif root.left == None and root.right != None: (T, right_max, right_min) = recursive(root.right) if T == False: return (False,-1,-1) elif right_min <= root.val: return (False,-1,-1) else: return (True, right_max, root.val) else: (Tr, right_max, right_min) = recursive(root.right) (Tl, left_max, left_min) = recursive(root.left) if Tr == False or Tl == False: return (False,-1,-1) elif left_max < root.val and root.val < right_min: return (True, right_max, left_min ) else: return (False,-1,-1) print(root) r = recursive(root) print(r[0]) return r[0] ``` > [name=玉山][time= Dec 7, 2022] ```python= # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def __init__(self): self.prev = -math.inf def isValidBST(self, root: Optional[TreeNode]) -> bool: if not root: return True # Inorder Traversal if not self.isValidBST(root.left): return False if root.val <= self.prev: return False self.prev = root.val return self.isValidBST(root.right) ``` > 來自樓下的靈感XD > [name=Kobe][time= Dec 9, 2022] #### C# ##### Inorder Traversal ```csharp= public class Solution { public bool IsValidBST(TreeNode root) { int? lastVal = null; Stack<TreeNode> stack = new Stack<TreeNode>(); StackAllLeftNode(root); while (stack.Count > 0) { TreeNode target = stack.Pop(); if (lastVal.HasValue && lastVal.Value >= target.val) { return false; } lastVal = target.val; StackAllLeftNode(target.right); } return true; void StackAllLeftNode(TreeNode node) { while(node != null) { stack.Push(node); node = node.left; } } } } ``` > [name=Jim][time= Dec 7, 2022] #### Javascript ```javascript= function isValidBST(root) { const stack = []; let prev = null; while (root !== null || stack.length > 0) { while (root !== null) { stack.push(root); root = root.left; } root = stack.pop(); if (prev !== null && root.val <= prev.val) return false; prev = root; root = root.right; } return true; } ``` > 參考俊豪學長的答案,感覺比玉山的優美XDD > 本來寫得很白癡以為可以,我放在discord給大家笑一下 > [name=Marsgoat][time= Dec 7, 2022] ### Reference [回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)