想象一下,你需要把一棵二叉树传输给一艘正在飞向半人马座α的卫星,而带宽十分有限。 由于树中没有重复的元素,因此可以用它的前序遍历和中序遍历来唯一地表示。
为卫星编写软件,让它根据这些遍历结果重建这棵树。
前序遍历会先(也就是“前”)读取当前节点的值,再按前序读取左子树。 之后按前序读取右子树。
中序遍历会先按中序读取左子树,然后读取当前节点,最后按中序读取右子树。 也就是从左到右依次读取。
例如,这棵树的前序遍历是 [a, i, x, f, r]。 这棵树的中序遍历是 [i, a, f, x, r]
a
/ \
i x
/ \
f r
注意:前序遍历中的第一个元素始终是根节点。
有时需要抛出一个异常。这样做时,应该始终包含一条有意义的错误消息,说明错误的来源。这能让代码更易读,并且对调试大有帮助。如果你知道错误来源属于某种类型,可以选择抛出内置错误类型中的一种,但仍然应该附上一条有意义的错误消息。
如果preorder和inorder这两个实参长度不匹配、元素不匹配,或者元素不唯一,这个练习就要求你使用raise语句来“抛出”一个ValueError。
只有当你既raise了这个exception,又附带了一条消息时,测试才会通过。
要抛出一个带消息的ValueError,请把消息作为实参传给exception类型:
# if preorder and inorder are not the same length
raise ValueError("traversals must have the same length")
# if preorder and inorder do not share the same elements
raise ValueError("traversals must have the same elements")
# if element repeat (are not unique)
raise ValueError("traversals must contain unique items")