給定一棵二叉樹的前序遍歷和中序遍歷,求其後序遍歷。(給定前序遍 曆與中序遍歷能夠唯一確定後序遍歷)
輸入:兩個字串,其長度 n 均小於等於 26。 第一行為前序遍歷,第二行為中序遍歷。二叉樹中的結點名稱以大寫字母表 示:a,b,c…最多 26 個結點。
輸出:輸入樣例可能有多組,對於每組測試樣例,輸出一行,為後序遍歷的字串。
該例題涉及二叉樹的建立、由二叉樹的兩種遍歷結果還原二叉樹、二叉樹的 遍歷等多種知識點。我們以分析該例題為例,介紹關於二叉樹各知識點。 由該例要求,首先我們需要根據給定的二叉樹前序和中序遍歷結果還原該二 叉樹。其次,我們需要將還原的二叉樹以二叉樹的形式儲存在記憶體中。最後,我 們需要對建立的二叉樹進行後序遍歷。 後序遍歷在前文中已經有所提及。下面我們對前兩部分做重點的闡述。 由給定的前序和中序遍歷還原得到該二叉樹。以前序遍歷結果 xdagfe , 和中序遍歷結果 adgxfe 為例詳細討論其還原方法。
由前序遍歷結果的首個元素為 x 可知,原樹必是由 x 為根結點。在中序遍 曆中,遍歷結果 adgxfe 以 x 為界分為兩個子串。其中第乙個子串 adg 為 x 的左子樹的中序遍歷結果,第二個子串 fe 為 x 的右子樹的中序遍歷結果。這樣 我們知道 x 的左子樹具有 3 個元素, x 的右子樹具有 2 個元素。根據元素的數 量我們同樣可以得知,在先序遍歷中去除根結點 x 後剩餘的串 dagfe 中,前 3 個字元 dag 為 x 的左子樹的前序遍歷結果,後 2 個字元 fe 為 x 的右子樹的前 序遍歷結果。
同樣的對於確定的左子樹前序遍歷結果 dag 和中序遍歷結果 adg 重複以 上確定過程,可知 d 為該子樹根結點,其左兒子為 a,右兒子為 g。 x 的右子樹前序遍歷結果 fe 和中序遍歷結果 fe 同樣可以確定該子樹以 f 為根節點,其左兒子不存在,右兒子為 e。
這樣我們就還原了原始二叉樹。 我們還需將還原出來的樹儲存在記憶體中。使用結構體:
struct node
表示樹的乙個結點,其字元資訊儲存在字元變數 c,若該結點存在左兒子或 者右兒子,則指向他們的指標儲存在 lchild 或 rchild 中,否則該指標為空。
#include
#include
using
namespace std;
struct node tree[50]
;//靜態記憶體分配陣列
int loc;
//靜態陣列中已經分配的節點個數
node*
create()
char str1[30]
, str2[30]
;//儲存前序和中序遍歷結果字串
void
postorder
(node* t)
if(t-
>rchild !=
null
) cout << t-
>c;
//遍歷該節點,輸出其字元資訊
}node*
build
(int s1,
int e1,
int s2,
int e2)}if
(rootldx != s2)
if(rootldx != e2)
return ret;
//返回根節點指標
}int
main()
return0;
}
在本例**中我們並沒有動態的申請記憶體空間,並在程式結束時釋放這些空間。而是使用了靜態陣列,利用分配陣列元素給相應的結點實現記憶體分配。這是 對記憶體分配較為簡單的實現方法,若讀者對動態的申請和釋放記憶體沒有把握,或者對何時何地釋放記憶體抱有疑惑,建議使用該較為保險的方法。 王道機試指南 二叉樹與二叉搜尋樹
二叉樹題目鏈結二叉樹 題意 在乙個完全二叉樹中給出乙個子樹的根和樹的最後乙個結點,求其子樹的結點個數。思路 分為三種情況 其中2 3情況均為乙個滿二叉樹,只需要知道其子樹的深度就可以直接算得,而對於第一種情況,需要先計算出其最後一層的結點樹,再加上以上的結點數。如下 include include ...
機試書 二叉樹遍歷
最開始一直想著在字串上 換順序 導致思路很不清晰。其實,就活學活用已經掌握的方法 根據前序和中序遍歷結果來構造二叉樹!構造二叉樹之後,再對其進行後序遍歷 遞迴的方法 要注意的點 題目說輸入 字串 但是其實一般來說,為了程式設計的方便,可以定義char陣列來儲存字串並進行操作,用法如下 char a ...
還原二叉樹
給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。輸入資料有多組,每組資料第一行輸入 1個正整數 n 1 n 50 為樹中結點總數,隨後 2行先後給出先序和中序遍歷序列,均是長度為 n的不包含重複英文本母 區分大小寫 的字串。輸出乙個整數,即該二叉樹的高度。9 abdfghiec ...