不清楚 internal 节点会有哪些值。这可能并不重要,但您可以始终在属于该特定子树的数据数组中分配 first 值。
“二进制代码”就像从根到节点的导航路径。因此,对于您提供的数据,我们预计会出现这样的树:
value: 1
path: ____________ "" ________
/ \
value: 1 15
path: __ 0 __ _____ 1 _______
/ \ / \
value: 1 72 15 1
path: 00 01 10 __ 11 __
/ \ / \ / \ / \
value: 1 23 72 3 15 7 1 77
path: 000 001 010 011 100 101 110 111
/ \ / \ / \ / \ / \
value: 23 5 3 5 7 78 1 5 77 23
path: 0010 0011 0110 0111 1010 1011 1100 1101 1110 1111
您可以使用一个简单的Node 类,它可以存储一个值和一个路径:
class Node:
def __init__(self, value, path, left=None, right=None):
self.value = value
self.path = path
self.left = left
self.right = right
par 函数会做这样的事情:
def par(data):
i = len(data) // 2
return (data[:i], data[i:]) if i else ()
if..else 运算符用于在只有一个数据元素时返回一个空列表。这将在 main 函数中很有用:
def maketree(data, path=""):
return Node(data[0], path, *(
maketree(part, path + str(i)) for i, part in enumerate(par(data))
))
这会枚举par 返回的部分并将这些部分传递给递归调用(如果返回任何部分)。同时,递归调用得到一个路径字符串,该字符串以 0 或 1 扩展(即枚举的索引)。
调用示例:
a = [1,23,5,72,3,5,15,7,78,1,5,77,23]
root = maketree(a)
# Output the properties of one particular node:
node = root.left.left.right.left
print("value: {}, path: {}".format(node.value, node.path))
# Outputs: "value: 23, path: 0010"