重建二叉樹

2021-09-26 21:29:38 字數 1449 閱讀 2396

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。

struct treenode 

};

自己的思路

其實題目很簡單,直接把這棵5樹畫出來就1分鐘,但是要用演算法寫出來,就不簡單了(至少對菜雞來說是,比如我),思路很簡單,首先就是對前序序列進行遍歷,找到根節點1,然後在中序序列中找到節點值為1的下標,此時中序遍歷中1的左邊為根節點的左子樹,為根節點的右子樹,再繼續遍歷前序序列,2為1的左孩子,為2的左子樹,以此類推,最終可以建立二叉樹。想法很簡單,但是自己平時幾乎沒有用過樹,於是寫起來很費勁,就比如找到左子樹的最後乙個節點,怎麼回到根節點,也不知道怎麼處理。主要是沒考慮用遞迴,其實樹裡面的演算法基本都是用遞迴來寫會很方便。錯誤的**也先上來吧,給以後留個紀念唄。

class solution 

}for

(int i=

1;isize()

;++i)

else}}

}};

大佬的思路

前序遍歷的第乙個節點一定是這棵二叉樹的根節點,根據中序遍歷序列,可以發現中序遍歷序列中節點之前的是這棵二叉樹的左子樹,是這棵二叉樹的右子樹。然後,對於左子樹,遞迴地把前序子串行和中序子串行看成新的前序遍歷和中序遍歷序列。此時,對於這兩個序列,該子樹的根節點是,該子樹的左子樹為、右子樹為空,如此遞迴下去(即把當前子樹當做樹,又根據上述步驟分析),這棵右子樹的分析也是這樣。(有點歸併排序的思想,採用分治,將大的問題分解成小的問題)

反正,就是記住,將樹分成根和左右子樹,然後對左右子樹繼續分成根和子樹,不斷的更新每次需要傳入的小子樹的前序和中序,即可完成二叉樹的建立。

上**

class solution 

}//對於中序遍歷,根節點左邊的節點位於二叉樹的左邊,根節點右邊的節點位於二叉樹的右邊

//利用上述這點,對二叉樹節點進行歸併

for(

int i=

0;i)for

(int i=gen+

1;i)//和shell排序的思想類似(分治),取出前序和中序遍歷根節點左邊和右邊的子樹

//遞迴,再對其進行上述所有步驟,即再區分子樹的左、右子子樹,直到葉節點(遞迴的出口)

head->left=

reconstructbinarytree

(left_pre,left_vin)

; head->right=

reconstructbinarytree

(right_pre,right_vin)

;return head;}}

;

二叉樹 重建二叉樹

問題 給定二叉樹的前序遍歷結果和中序遍歷結果,恢復出原二叉樹。假設二叉樹中的元素都不重複,給定二叉樹的前序遍歷序列,二叉樹的中序遍歷序列。看到此題,我首先想到的是尋找根節點,由前序遍歷序列可以看出根節點為1,此時通過中序遍歷可以看出來4,7,2在根節點的左子樹,5,3,8,6在樹的右節點。此時我們可...

二叉樹 重建二叉樹

題目給定兩個陣列,乙個是前序遍歷陣列 preorder 乙個是中序遍歷陣列 inorder 要求輸出還原二叉樹 核心在於我們要理解前序和中序便利的特點 前序遍歷 根節點 左節點 右節點 中序遍歷 左節點 根節點 右節點 所以我們從二叉樹的根節點開始重構 也就是preorder的第乙個值 同時用乙個m...

二叉樹重建

摘自劉汝佳的 演算法競賽入門經典 preorder t t 的根結點 preorder t 的左子樹 preorder t 的右子樹 inorder t inorder t 的左子樹 t 的根結點 inorder t 的右子樹 postorder t postorder t 的左子樹 postord...