在有序和预订遍历的情况下生成后订单遍历

时间:2012-03-11 21:42:20

标签: c data-structures binary-tree

我看到代码发布在这里: 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);

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

假设binary expression tree以及inorder,preorder和postorder遍历如何作用于它:

  1. inorder:左子树,当前根,右子树
  2. preorder:当前根,左子树,右子树
  3. postorder:左子树,右子树,当前根
  4. 现在的当前代码,首先标识左右子树。我们知道预序数组的第一个元素是我们的根,我们可以在inorder数组中找到相应的根。因为我们知道root之前的所有元素都是子树的元素,而后面的所有元素都是右子树的元素。

    我们想要生成后序遍历,所以我们递归地继续使用左子树:

       postorder(preorder, prestart+1, inorder, inostart, i-inostart);
    
    1. 预启动+ 1: 因为左子树的根刚好在预先遍历的当前根之后
    2. i-inostart: 因为 i 是inorder数组中root的索引,所以 i-inostart 就是大小左子树
    3. 然后是右子树:

         postorder(preorder, prestart+i-inostart+1, inorder, i+1, length-i+inostart-1);
      
      1. 预启动+ i-inostart + 1: 正如我上面所说的 i-inostart 是左子树的大小,我们也知道在预订数组中右子树的根将在当前根和整个子树之后,因此其索引将是预启动+ i-inostart + 1
      2. i + 1: 因为在inorder数组中,根的索引是 i ,之后的元素应该是inorder数组中右子树的开头
      3. length -i + inostart-1: 因为右子树的大小为长度减去左子树的大小而减去1(根)
      4. 然后输出我们当前的根目录:

           cout<<preorder[prestart]<<" ";
        

        以递归方式执行此操作会导致树的后序遍历。