已知二叉樹的先序和中序求後序和已知中序和後序求前序

2021-06-21 13:11:55 字數 1287 閱讀 1579

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

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

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

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

有如下圖的二叉樹:

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

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

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

如上面的例子:先序遍歷的第乙個字元是d,則根節點為d,從中序遍歷中可以找到d的位置,左邊的abc即為左子樹的字元,右邊的eg

f即為右子樹的字元,如果開始遞迴函式為:build("dbacegf"),則找到根的位置後,可以分為遞迴左子樹的先序遍歷和遞迴右子樹的先序遍歷:build("bac")和build("eg

f"),其對應的中序遍歷為:abc和e

gf。然後繼續進行以上步驟,直到找完先序序列。每找到根就可以直接輸出或儲存到陣列中,需要注意的是遞迴的時候不要把根包含在內。

**如下:

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

#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)即是先序遍歷中左子樹的結束位置,遞迴右子樹同理。

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

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

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

#include#include char a[27],b[27];

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

int main()

}

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

二叉樹 已知先序和中序求後序,已知中序和後序求先序

樹的三種遍歷方式的遍歷順序 先序遍歷 根 左子樹 右子樹 特點 第乙個元素為根 中序遍歷 左子樹 根 右子樹 特點 根的兩邊分別為左子樹和右子樹 後序遍歷 左子樹 右子樹 根 特點 最後乙個元素為根 有如下圖的二叉樹 其先序 中序 後序遍歷分別為 dbacegf abcdefg acbfged。1 ...

二叉樹已知先序中序求後序 已知中序後序求先序

在做資料結構面試題的時候我們會經常發現有關二叉樹的題目總是這樣的 栗子 已知某二叉樹先序為 中序為 求後序 已知某二叉樹中序為 後序為 求先序 需要注意的是 我們只能夠通過已知先序中序求後序或已知中序後序求先序,而不能夠已知先序和後序求中序 下面總結一下兩種題的做法 首先回顧知識點 第一種 已知乙個...

已知二叉樹先序和中序,求後序。

從處 一 已知前序 中序遍歷,求後序遍歷 例 前序遍歷 gdafemhz 中序遍歷 adefghmz 畫樹求法 第一步,根據前序遍歷的特點,我們知道根結點為g 第二步,觀察中序遍歷adefghmz。其中root節點g左側的adef必然是root的左子樹,g右側的hmz必然是root的右子樹。第三步,...