開始學(xué)算法(刷算法題)過程記錄 6
題目描述:給定節(jié)點數(shù)為 n 的二叉樹的前序遍歷和中序遍歷結(jié)果,請重建出該二叉樹并返回它的頭結(jié)點。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建出如下圖所示。

題目關(guān)鍵:前序遍歷是指遍歷順序為根左右,第一個數(shù)肯定是根。中序遍歷是指遍歷順序為左根右,中序遍歷根一定在中間。在數(shù)據(jù)結(jié)構(gòu)課程中,給出前序和中序,讓你寫出后序遍歷是一道常見的題目,可以很容易的寫出來。但落實到算法上還需要對遞歸有一定的理解。
題目思路:

如圖所示,一開始我們有前序遍歷的數(shù)組和后序遍歷的數(shù)組。第一步,拿前序第一個生成一個節(jié)點作為根節(jié)點;第二步,根據(jù)根節(jié)點分割中序遍歷數(shù)組;第三步,分割前序遍歷數(shù)組,把前序遍歷數(shù)組劃分出左右子樹;
接著遞歸執(zhí)行這些步驟,邊界條件為左右子樹為空或者是葉子結(jié)點??梢栽O(shè)置被分割的先序數(shù)組為空則返回null。為方便理解再演示一次

分割后左子樹的前序遍歷和中序遍歷再次調(diào)用該方法,邏輯同上。2為根節(jié)點,以2為界把中序遍歷分割為左右子樹,左右子樹再次調(diào)用該方法,直到分割成下圖所示

再以7為界分割出來的左右子樹都是空數(shù)組[]??諗?shù)組作為參數(shù)再次調(diào)用將碰到邊界條件pre[0]==undefined,返回null。
算法實現(xiàn):
slice(start,end)返回數(shù)組中被選中的元素。?start?參數(shù)開始的元素,并在給定的?end?參數(shù)處結(jié)束,但不包括。不會改變原始數(shù)組。