题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:知道了二叉树的前序和中序的序列就可以使用递归的方法找出根节点和左右子树了。以题目为例,首先看前序序列1一定是根节点,然后找到1在中序序列中的位置,中序序列中1前面的是左子树,1后面的是右子树。这样就找出子问题来了。可以使用分治递归了。注意特殊传参和递归结束的条件。
实现代码:
/** * 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 == null || pre.length == 0 || in == null || in.length == 0 || pre.length != in.length) { return null; } return build(pre, 0, pre.length-1, in, 0, in.length-1); } public TreeNode build(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) { TreeNode root = new TreeNode(pre[startPre]); if(startPre == endPre) return root; int rootPos = startIn; while(rootPos <= endIn && in[rootPos] != pre[startPre]) { rootPos ++; } int leftLength = rootPos - startIn; if(leftLength > 0) { //构造左子树 root.left = build(pre, startPre+1, startPre+leftLength, in, startIn, rootPos-1); } if(endIn - rootPos > 0) { //构造右子树 root.right = build(pre, startPre+leftLength+1, endPre, in, rootPos+1, endIn); } return root; } }