劍指Offer 面試題7 重建二叉樹

2021-08-28 01:13:10 字數 1488 閱讀 3503

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹,假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,輸入前序遍歷序列和中序遍歷,則重建如圖2.6所示的二叉樹並輸出它的頭節點。

分析:前序遍歷:先根,再左,後右;

中序遍歷:先左,再根,後右。

那麼前序遍歷的第乙個是根,在中序遍歷中找到根位置,即可確定左右子樹的分布。例如:

前序:1為root    陣列表示根,左,右為: pre[0],pre[0+1,0+3],pre[0+3+1,length-1]

中序:4,7,2為左子樹,5,3,8,6為右子樹。陣列表示根,左,右: in[3],in[0,2],in[3+1,lengh-1]

設index為根結點在中序遍歷中的位置,前序遍歷起始位置為ps,pe,中序is,ie那麼上面在前序、中序中根左右可化簡為以下表示:

首先:左子樹個數應為index-is(3-0)

前序表示:pre[ps],pre[ps+1,ps+index-is],pre[ps+index-is+1,pe]

後序表示:in[is],in[is,index-1],in[index+1,ie]

那麼程式如下:

package main;

public class seven_createtree

public static void main(string args);

int in=;

treenode node = seven_createtree.reconstructbinarytree(pre,in);

seven_createtree.printtree(node);

}/**

* 給定二叉樹的前序遍歷和中序遍歷,重構二叉樹

*//**

** @param pre 前序遍歷

* @param in 中序遍歷

* @return

*/public treenode reconstructbinarytree(int pre,int in)

return construct(pre,0,pre.length-1,in,0,in.length-1);

}/**

** @param pre 前序遍歷

* @param ps 前序遍歷起點

* @param pe 前序遍歷終點位置

* @param in 中序遍歷

* @param is 中序遍歷起點位置

* @param ie 中序遍歷終點位置

* @return

*/public treenode construct(int pre,int ps,int pe,int in,int is,int ie)

private void printtree(treenode root)}}

執行結果為(中序遍歷):

劍指offer面試題7 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。class solution struct treenode reconstruct int l1,int r1,int l2 pr...

劍指offer 面試題7 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建出二叉樹並輸出他的根節點。二叉樹的定義如下 public static class binarytreenode 在二叉樹的前序遍歷中,第乙個數字總...

劍指offer 面試題7 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。示例 例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。二叉樹的前序遍歷序列中,第乙個數字總是樹的根節點的值。二叉樹的中序遍歷序列中,根節點的值在序列的中間,左子樹節點的值位於根節點...