劍指offer—–重建二叉樹(java版)

NO IMAGE

一 題目

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

二 例子

輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。

三 思路

根據前序遍歷可以知道二叉樹的根為1,所以中序遍歷中前3個是根的左子樹,1的後面元素是根的右子樹,可以看到,前序遍歷的1(根)的後3個是根的左子樹,後4個是根的右子樹,所以程式一開始應該找到中序遍歷樹的根位置,然後遞迴構建二叉樹。以根作為標準,以中序遍歷左側n個元素與前序遍歷除根之外的前n個元素進行左子樹構建,以中序遍歷右側n個元素與前序遍歷除根之外的後n個元素進行右子樹構建。

四 程式原始碼

import java.util.Arrays;
/**
* Definition for binary tree
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0 || in.length==0)
return null;
TreeNode node = new TreeNode(pre[0]);
for(int i=0;i<pre.length;i  ){
if(pre[0] == in[i]){
node.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,i 1),Arrays.copyOfRange(in,0,i));
node.right = reConstructBinaryTree(Arrays.copyOfRange(pre,i 1,pre.length),Arrays.copyOfRange(in,i 1,in.length));
break;
}
}
return node;
}
}