重建二叉树
2014-05-28 09:16
239 查看
剑指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; } }