diff --git a/trees/is_valid_bst.py b/trees/is_valid_bst.py new file mode 100644 index 0000000..ec7a1dc --- /dev/null +++ b/trees/is_valid_bst.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# author: bt3gl + + +def is_valid_bst_recursive(root): + + def is_valid(root, min_val=float(-inf), max_val=float(inf)): + if root is None: + return True + + return (min_val < root.val < max_val) and \ + is_valid(root.left, min_val, root.val) and \ + is_valid(root.right, root.val, max_val) + + return is_valid(root) + + +def is_valid_bst_iterative(root): + + queue = deque() + queue.append((root, float(-inf), float(inf))) + + while queue: + node, min_val, max_val = queue.popleft() + if node: + if min_val >= node.val or node.val >= max_val: + return False + if node.left: + queue.append((node.left, min_val, node.val)) + if node.right: + queue.append((node.right, node.val, max_val)) + + return True + + +def is_valid_bst_inorder(root): + + def inorder(node): + if node is None: + return True + + inorder(node.left) + queue.append(node.val) + inorder(node.right) + + queue = [] + inorder(root) + for i in range(1, len(queue)): + if queue[i] <= queue[i-1]: + return False + + return True +