二叉樹24 重建二叉樹

2021-07-31 08:47:41 字數 1233 閱讀 1604

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

思路:已知一棵樹的先序遍歷的結果陣列和中序遍歷的結果,要求據此重建一棵二叉樹,即重建所有結點並設定結點之間的指標關係,最後返回這棵樹的根結點。分析二叉樹的前序遍歷和中序遍歷的特徵。

先序遍歷:①[②④⑦][③⑤⑥⑧]

中序遍歷:[④⑦②]①[⑤③⑧⑥]

對於先序遍歷的陣列arr1[begin,end],第乙個元素就是陣列對應樹的根結點,顯然①是根結點,然後根據值1遍歷中序陣列arr2,已知元素不重複,因此可以找到唯一的元素,找到其在arr2中的位置為i,此時arr2中[begin,i-1]是結點①的左子樹對應的陣列,[i+1,end]是結點①的右子樹對應的陣列,分別求出這2個子陣列的長度length1=i-1-begin+1=i-begin;length2=end-i-1+1=end-i。然後取先序陣列arr1中找出對應的子陣列,分別是[begin+1,begin+length1],[begin+lenght1+1,end],於是得到了:

用來構建結點①左子樹所需的先序陣列和中序陣列arr1[begin+1,begin+length1]+arr2[begin,i-1];

用來構建結點①右子樹所需的先序陣列和中序陣列arr2[begin+lenght1+1,end]+arr2[i+1,end];

於是問題有回到了原始的問題上面來了,呼叫遞迴方法分別出入這2個陣列以及邊界,返回建立起來的二叉樹的頭結點,然後將其與當前結點arr1[begin]連線起來即可。

邊界條件是:如果陣列對於arr1陣列或者arr2陣列,有begin

//輸入二叉樹的先序和中序陣列,重建二叉樹返回樹的頭結點

public class solution

//遞迴函式:傳入二叉樹的先序和中序遍歷的陣列或者陣列區間,返回構建的二叉樹的頭結點

private treenode process(int arr1,int begin1,int end1,int arr2,int begin2,int end2)

//函式:根據值val在陣列中找到對應的下標

private int getindexinarr2(int arr,int val){

int res=0;

for(int i=0;i

二叉樹 2255 重建二叉樹

總時間限制 1000ms 記憶體限制 65536kb 描述給定一棵二叉樹的前序遍歷和中序遍歷的結果,求其後序遍歷。輸入輸入可能有多組,以eof結束。每組輸入包含兩個字串,分別為樹的前序遍歷和中序遍歷。每個字串中只包含大寫字母且互不重複。輸出對於每組輸入,用一行來輸出它後序遍歷結果。樣例輸入 dbac...

二叉樹 重建二叉樹

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

二叉樹 重建二叉樹

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