首先根据定义,先序的第一个元素为根节点,由于规定元素没有重复,所以可以根据根节点数值来将中序遍历数组中左右子数分开。
同时根据左右子数的个数继续拆分对应的先序数组,递归左右子树得到结果
/** * Created by itworker365 on 5/12/2017. */ public class RebuildBTree { //有一个前提是元素无重复 public static void main(String[] args) { //根左右 int[] preTrace = {1,2,4,7,3,5,6,8}; //左根右 int[] midTrace = {4,7,2,1,5,3,8,6}; RebuildBTree rebuildBTree = new RebuildBTree(); TreeNode treeNode = rebuildBTree.reConstructBinaryTree(preTrace, midTrace); } public TreeNode reConstructBinaryTree(int [] pre,int [] in) { if (pre.length == 0 || in.length == 0) { return null; } return reConstructBinaryTree111(pre, 0, pre.length - 1, in, 0, in.length - 1); } public TreeNode reConstructBinaryTree111(int [] pre,int pstart, int pend, int [] in, int istart, int iend) { if (pstart > pend || istart > iend) { return null; } TreeNode root=new TreeNode(pre[pstart]); //首先由先序遍历知道第一个元素肯定是根元素,遍历中序找,找到根节点 //将中序结果分为两个子子数,根据元素个数同时拆分先序数组,分别构建左右子树 for(int i = istart; i <= iend; i++) if(in[i] == pre[pstart]){ root.left = reConstructBinaryTree111(pre, pstart + 1, pstart + i - istart, in, istart, i - 1); root.right = reConstructBinaryTree111(pre, i - istart + pstart + 1, pend, in, i + 1, iend); } return root; } } class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } public void setLeft(TreeNode left) { this.left = left; } public void setRight(TreeNode right) { this.right = right; } }