【发布时间】:2021-07-07 18:26:07
【问题描述】:
class Node:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
def construct(start, end, preorder, pIndex, dict):
# base case
if start > end:
return None, pIndex
root = Node(preorder[pIndex])
pIndex = pIndex + 1
index = dict[root.data]
root.left, pIndex = construct(start, index - 1, preorder, pIndex, dict)
root.right, pIndex = construct(index + 1, end, preorder, pIndex, dict)
return root, pIndex
def constructTree(inorder, preorder):
dict = {}
for i, e in enumerate(inorder):
dict[e] = i
pIndex = 0
return construct(0, len(inorder) - 1, preorder, pIndex, dict)[0]
if __name__ == '__main__':
inorder = [4, 2, 1, 7, 5, 8, 3, 6]
preorder = [1, 2, 4, 3, 5, 7, 8, 6]
root = constructTree(inorder, preorder)
print("The inorder traversal is ", end='')
inorderTraversal(root)
preorderTraversal(root)
此代码使用前序和中序遍历构造一棵树。如何修改该代码以使其适用于 inorder-postorder 和 preorder-postorder?我想我只需要修改construct() 并以类似的方式创建constructPreOrderInOrderTree() 和constructPreOrderPostOrderTree()。
编辑
假设我有inorder=[3, 7, 1, 10, 9, 5, 8, 6, 4, 2] 和postorder = [3, 7, 10, 9, 1, 8, 4, 6, 2, 5]。 construct() 会针对 inorder-preorder 执行此操作,但不适用于该示例。所以我需要该函数的一个版本,它可以同时用于 inorder-postorder 和 preorder-postorder。
【问题讨论】:
-
你能解释一下
inorder-preorder和preorder-postorder和inorder-postorder是什么意思吗?我可以理解仅订购或预购或后订购的含义,但不能合并。 -
哦,是的!如果我给你
inorder=[3, 7, 1, 10, 9, 5, 8, 6, 4, 2],你就不能完全重建二叉树。您需要其他东西来完全构建二叉树。inorder = [4, 2, 1, 7, 5, 8, 3, 6]和preorder = [1, 2, 4, 3, 5, 7, 8, 6]将从该问题生成二叉树:stackoverflow.com/questions/67059333/… -
@Arty 如果您想了解更多,请查看geeksforgeeks.org/…。
-
但是 GeeksForGeeks 网站上已经提供了算法代码。 StackOverflow 专家不需要发明一些东西,只需从那里获取代码。例如这里是inorder-postorder 算法。我认为他们的网站上也可以使用 preorder-postorder。
-
顺便说一句,您确定任务的
preorder-postorder变体是可解决的吗?这个任务是你自己发明的,还是 geeksforgeeks 练习题数据集的一部分?您能否在 GeeksForGeeks 网站上指向preorder-postorder问题描述的链接?
标签: python binary-tree inorder preorder postorder