王道計算機機試 二叉樹的還原

2021-10-03 16:28:19 字數 2008 閱讀 9794

給定一棵二叉樹的前序遍歷和中序遍歷,求其後序遍歷。(給定前序遍 曆與中序遍歷能夠唯一確定後序遍歷)

輸入:兩個字串,其長度 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 ...