繁体   English   中英

给定有序遍历和前序遍历,生成后序遍历

[英]Generate the post-order traversal given the in-order and pre-order traversal

我看到代码发布在这里: 给定有序和后序遍历,如何输出树的前序遍历?

但是,我在理解逻辑时遇到了麻烦,尤其是对于树的正确部分的递归:

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

任何帮助,将不胜感激。

假定二元表达式树以及有序,前顺序和后顺序遍历如何作用于它:

  1. inorder :左子树,当前根,右子树
  2. preorder :当前根,左子树,右子树
  3. postorder :左子树,右子树,当前根

现在是当前代码,首先标识左和右子树。 如我们所知,前置数组的第一个元素是我们的根,我们可以在有序数组中找到对应的根。 我们知道,根之前的所有元素都是左子树的元素,根之后的所有元素都是右子树的元素。

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

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

然后是右子树:

   postorder(preorder, prestart+i-inostart+1, inorder, i+1, length-i+inostart-1);
  1. prestart + i-inostart + 1: 正如我在上面所讲过的, i-inostart是左子树的大小,而且我们知道在预排序数组中,右子树的根将在当前根和整个子树之后,因此其索引将是prestart + i-inostart + 1
  2. i + 1: 因为在有序数组中根的索引是i ,其后的元素应该是有序数组中右子树的开始
  3. length-i + inostart-1: 因为右子树的大小是长度减去左子树的大小再减去1(根)

然后输出我们当前的根目录:

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

递归地执行此操作将导致该树的后序遍历。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM