我看到代码发布在这里: 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);
任何帮助都将不胜感激。
答案 0 :(得分:3)
假设binary expression tree以及inorder,preorder和postorder遍历如何作用于它:
inorder
:左子树,当前根,右子树preorder
:当前根,左子树,右子树postorder
:左子树,右子树,当前根现在的当前代码,首先标识左右子树。我们知道预序数组的第一个元素是我们的根,我们可以在inorder数组中找到相应的根。因为我们知道root之前的所有元素都是子树的元素,而后面的所有元素都是右子树的元素。
我们想要生成后序遍历,所以我们递归地继续使用左子树:
postorder(preorder, prestart+1, inorder, inostart, i-inostart);
然后是右子树:
postorder(preorder, prestart+i-inostart+1, inorder, i+1, length-i+inostart-1);
然后输出我们当前的根目录:
cout<<preorder[prestart]<<" ";
以递归方式执行此操作会导致树的后序遍历。