about summary refs log tree commit diff
path: root/scratch/facebook/bst-checker.py
blob: 50edeeaa19978315fb821a8215c10b46511ee086 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
from collections import deque

class Node(object):
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

    def insert_left(self, value):
        self.left = Node(value)
        return self.left

    def insert_right(self, value):
        self.right = Node(value)
        return self.right

    def min(self):
        xs = deque()
        result = float('inf')
        xs.append(self)
        while xs:
            node = xs.popleft()
            result = min(result, node.value)
            if node.left:
                xs.append(node.left)
            if node.right:
                xs.append(node.right)
        return result

    def max(self):
        xs = deque()
        result = float('-inf')
        xs.append(self)
        while xs:
            node = xs.popleft()
            result = max(result, node.value)
            if node.left:
                xs.append(node.left)
            if node.right:
                xs.append(node.right)
        return result

    def is_bst(self):
        result = True
        if self.left:
            result = result and self.left.max() < self.value
        if self.right:
            result = result and self.right.min() > self.value
        return result


x = Node(
    50,
    Node(
        17,
        Node(
            12,
            Node(9),
            Node(14),
        ),
        Node(
            23,
            Node(19),
        ),
    ),
    Node(
        72,
        Node(
            54,
            None,
            Node(67)
        ),
        Node(76),
    ),
)


assert x.is_bst()
print("Success!")