剑指offer第六题,自己很快得出了由先序和中序遍历得出树的结构的思路,但是实现起来遇到了一些困难,花了不少时间
package com.zjy.sword2offer;
class TreeNode{
int val;
TreeNode left;
TreeNode right;
}
public class ReconstructTree {
public TreeNode ReconstrTree(int[] a, int[] b) throws Exception{
if(a==null||b==null||a.length<=0||b.length<=0)
return null;
if(a.length!=b.length)
return null;
return ReconstrTreeCore(a, 0,a.length-1, b,0,a.length-1);
}
public TreeNode ReconstrTreeCore(int[] a,int prestart,int preend,
int[] b,int instart,int inend) throws Exception{
int rootvalue = a[prestart];
TreeNode root = new TreeNode();
root.val = rootvalue;
root.left = root.right =null;
if(prestart==preend)
{
if(instart==inend && a[preend]==b[inend])
return root;
else
throw new Exception("invalid input");
}
int rootinorder = instart;
while(rootinorder<inend && a[rootinorder]!=rootvalue)
rootinorder++;
if(rootinorder==inend&&a[rootinorder]!=rootvalue)
new Exception("invalid input");
int leftTreeLen = rootinorder - instart;
if(leftTreeLen>0)
{
root.left = ReconstrTreeCore(a,prestart+1,prestart+leftTreeLen,
b,instart,rootinorder-1);
}
if(leftTreeLen<preend-prestart)
{
root.right = ReconstrTreeCore(a,prestart+leftTreeLen+1,preend,
b,rootinorder+1,inend);
}
return root;
}
}