题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
代码实现
/** * */ package offerTest; /** * <p> * Title:ReConstructBinaryTree * </p> * <p> * Description: * </p> * * @author MaoLin Tian * @data 2017年8月20日 下午8:06:48 */ public class ReConstructBinaryTree { public TreeNode reConstructBinaryTree(int[] pre, int[] in) { int lenpre = pre.length; int lenin = in.length; return helper(pre, 0, lenpre - 1, in, 0, lenin - 1); } //帮助函数,用于递归调用 public TreeNode helper(int[] pre, int startpre, int endpre, int[] in, int startin, int endin) { // 在中序遍历中找到根节点 if (startpre > endpre || startin > endin) { return null; } TreeNode root = null; int i = startin; for (; i <= endin; i++) { if (pre[startpre] == in[i]) { root = new TreeNode(in[i]); // 找到根节点的下标 break; } } root.left = helper(pre, startpre + 1, startpre + i - startin, in, startin, i - 1); // 递归实现左子树 root.right = helper(pre, startpre + i - startin + 1, endpre, in, i + 1, endin); // 递归实现右子树 return root; } public static void main(String[] args) { } }