簡體   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