我看到代码贴在这里:
How do I output the preorder traversal of a tree given the inorder and postorder tranversal?
不过,我很难理解逻辑,尤其是树的右侧部分的递归:

postorder(preorder, prestart+i-inostart+1, inorder, i+1, length-i+inostart-1);

任何帮助都将不胜感激。

最佳答案

假设binary expression tree以及顺序遍历、前序遍历和后序遍历是如何作用于它的:
inorder:左子树、当前根、右子树
preorder:当前根、左子树、右子树
postorder:左子树、右子树、当前根
现在的代码,首先标识左子树和右子树。如我们所知,序数组的第一个元素是根,我们可以在序数组中找到对应的根。我们知道,根之前的所有元素都是左子树的元素,根之后的所有元素都是右子树的元素。
我们想产生后序遍历,所以我们递归地继续左子树:

   postorder(preorder, prestart+1, inorder, inostart, i-inostart);

prestart+1:因为左子树的根正好在当前根之后,在preorder遍历中
i-inostart:因为i是有序数组中根的索引,所以i-inostart将是左子树的大小
然后右子树:
   postorder(preorder, prestart+i-inostart+1, inorder, i+1, length-i+inostart-1);

prestart+i-inostart+1:如前所述,i-inostart是左子树的大小,而且我们知道在预排序数组中,右子树的根将在当前根和整个子树之后,因此其索引将是prestart+i-inostart+1
i+1:因为在inorder数组中,根的索引是i,之后的元素应该是inorder数组中右子树的开始
length-i+inostart-1:因为右子树的大小是length减去左子树的大小,再减去1(根)
然后输出当前根:
   cout<<preorder[prestart]<<" ";

递归地这样做将导致树的后序遍历。

10-08 13:18