输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / 9 20 / 15 7
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { int prelen = preorder.length; int inlen = inorder.length; if(prelen!=inlen) { throw new RuntimeException("Incorrect input data"); } HashMap<Integer,Integer> map = new HashMap<>(); for(int i=0;i<inlen;i++) { map.put(inorder[i],i); } return buildTree(preorder,0,prelen-1,map,0,inlen-1); } /** * @param preorder 前序遍历序列 * @param preLeft 前序遍历序列子区间的左边界,可以取到 * @param preRight 前序遍历序列子区间的右边界,可以取到 * @param map 在中序遍历序列里,数值与小标对应关系 * @param inLeft 中序遍历序列子区间的左边界,可以取到 * @param inRight 中序遍历序列子区间的右边界,可以取到 * @return */ private TreeNode buildTree(int[] preorder, int preLeft,int preRight, Map<Integer,Integer> map, int inLeft,int inRight) { if( preLeft > preRight || inLeft > inRight) { return null; } int rootVal = preorder[preLeft]; TreeNode root = new TreeNode(rootVal); int pIndex = map.get(rootVal); root.left = buildTree(preorder,preLeft+1,pIndex-inLeft+preLeft,map,inLeft,pIndex-1); root.right = buildTree(preorder,pIndex-inLeft+preLeft+1,preRight,map,pIndex+1,inRight); return root; } }