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