已知先序和中序求後序或中序和後序求先序

2021-07-07 07:47:28 字數 1368 閱讀 4421

首先介紹樹的三種遍歷方式的遍歷順序:

先序遍歷:根、左子樹、右子樹(特點:第乙個元素為根)

中序遍歷:左子樹、根、右子樹(特點:根的兩邊分別為左子樹和右子樹)

後序遍歷:左子樹、右子樹、根(特點:最後乙個元素為根)

有如下圖的二叉樹:

其先序、中序、後序遍歷分別為:dbacegf、abcdefg、acbfged。

1、已知先序和中序求後序

先序遍歷的第乙個字元為根,因此只需在中序遍歷中找到它,就可以把根節點的左子樹和右子樹分開,就可以知道左子樹的字元個數和右子樹的字元個數,然後可以確定先序遍歷中哪部分是左子樹,哪部分是右子樹,之後遞迴先序遍歷的序列,直到結束。

如上面的例子:先序遍歷的第乙個字元是d,則根節點為d,從中序遍歷中可以找到d的位置,左邊的abc即為左子樹的字元,右邊的efg即為右子樹的字元,如果開始遞迴函式為:build("dbacegf"),則找到根的位置後,可以分為遞迴左子樹的先序遍歷和遞迴右子樹的先序遍歷:build("bac")和build("efg"),其對應的中序遍歷為:abc和efg。然後繼續進行以上步驟,直到找完先序序列。每找到根就可以直接輸出或儲存到陣列中,需要注意的是遞迴的時候不要把根包含在內。

**如下:

//已知先序和中序求後序

方法一:

#include

#include

char a[27],b[27];//存先序遍歷和中序遍歷

void fun(int ab, int ae, int bb, int be)

int main()

}其中ae-be+i是ae-(be-i),be-i是右子樹的長度,ae-(be-i)即是先序遍歷中左子樹的結束位置,遞迴右子樹同理。

方法二:

#include

#include

#include

using namespace std;

void build(int n,char *s1,char *s2,char *s)

int main()

return 0;

} 2、已知中序和後序求先序

後序序列的特點是最後乙個是根,道理與已知先序和中序求後序一樣,同樣是遞迴,只是需要改變幾個引數。附上**和注釋。

方法一:

#include

#include

char a[27],b[27];

void fun(int ab, int ae, int bb, int be)

int main()

int main()

return 0;

} 在以上程式中,給函式傳遞了四個引數,分別代表起始和結束位置,其實可以只需要三個引數即可,因為中序遍歷的起始位置可以通過另外乙個序列的長度來找到,所以只需要ab、ae、be即可。

已知中序和後序求先序

include include using namespace std struct tnode define len sizeof tnode typedef tnode pbtnodepoint void vcreate string sinorder,string spostorder,pbt...

已知先序和中序求後序

輸入二叉樹的先序遍歷序列和中序遍歷序列,輸出該二叉樹的後序遍歷序列。input 第一行輸入二叉樹的先序遍歷序列 第二行輸入二叉樹的中序遍歷序列。output 輸出該二叉樹的後序遍歷序列。sample input abdcef bdaecf sample output dbefca include i...

已知後序中序,求先序

利用後序遍歷的最後乙個元素 根結點 在中序遍歷中找到它,分割為左子樹和右子樹,然後在後序遍歷中找到子樹的根結點 起點 終點,分別遞迴。int leftrootpo rootpo end rootin 1 左子樹的根結點在後序遍歷中的位置。end rootin 右子樹的結點個數 int leftsta...