您可以使用 O(n) 中的后序遍历来构造树,其原理如下:
- 最后一个元素总是树根
- 所有大于根的先前元素都是右子树的一部分。所有较小的元素都是左子树的一部分。
- 您可以递归地应用上述规则。
按顺序构造更简单。您只需选择中间元素作为根并在两侧递归调用它。
这是一个示例实现(在 Python 中),显示了这两种结构:
from collections import deque
def print_graphviz(tree):
if not isinstance(tree, tuple):
return tree
left = print_graphviz(tree[0])
right = print_graphviz(tree[2])
if left is not None: print tree[1], '->', left
if right is not None: print tree[1], '->', right
return tree[1]
def visit_post_order(in_queue, limit = None):
if len(in_queue) == 0 or in_queue[-1] < limit:
return None
root = in_queue.pop()
right = visit_post_order(in_queue, max(root, limit))
left = visit_post_order(in_queue, limit)
if left is None and right is None:
return root
else:
return (left, root, right)
def visit_in_order(in_order, begin, end):
if begin==end: return None
if begin+1==end: return in_order[begin]
mid = (begin+end)/2
root = in_order[mid]
left = visit_in_order(in_order, begin, mid)
right = visit_in_order(in_order, mid+1, end)
if left is None and right is None:
return root
else:
return (left, root, right)
def from_post_order(post_order):
return visit_post_order(deque(post_order))
def from_in_order(in_order):
return visit_in_order(in_order, 0, len(in_order))
print 'digraph {'
print print_graphviz(from_post_order([0, 2, 1, 4, 3, 6, 8, 7, 5]))
#print print_graphviz(from_in_order([1, 2, 3, 4, 5, 6, 7, 8]))
print '}'
像这样运行:
python test.py | dot -Tpng | display
你会得到一个漂亮的树输出: