forked from adnanaziz/EPIJudge
-
Notifications
You must be signed in to change notification settings - Fork 0
/
kth_node_in_tree.py
52 lines (39 loc) · 1.51 KB
/
kth_node_in_tree.py
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
import functools
from test_framework import generic_test
from test_framework.test_failure import TestFailure
from test_framework.test_utils import enable_executor_hook
class BinaryTreeNode:
def __init__(self, data=None, left=None, right=None, size=None):
self.data = data
self.left = left
self.right = right
self.size = size
def find_kth_node_binary_tree(tree, k):
while tree:
left_size = tree.left.size if tree.left else 0
if left_size + 1 < k: # k-th node must be in right subtree of tree.
k -= left_size + 1
tree = tree.right
elif left_size == k - 1: # k-th is iter itself.
return tree
else: # k-th node must be in left subtree of iter.
tree = tree.left
return None # If k is between 1 and the tree size, this is unreachable.
@enable_executor_hook
def find_kth_node_binary_tree_wrapper(executor, tree, k):
def init_size(node):
if not node:
return 0
node.size = 1 + init_size(node.left) + init_size(node.right)
return node.size
init_size(tree)
result = executor.run(
functools.partial(find_kth_node_binary_tree, tree, k))
if not result:
raise TestFailure("Result can't be None")
return result.data
if __name__ == '__main__':
exit(
generic_test.generic_test_main("kth_node_in_tree.py",
"kth_node_in_tree.tsv",
find_kth_node_binary_tree_wrapper))