1、 题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
2、思路:前序遍历--根左右 ,中序遍历--左根右
拿到题目之后,很容易按照自己的思维先把题目中给的例子进行重建,一点点的重建就会让自己陷入到无数的细节中,从而丧失全局思维。这道题不可能用普通的方式一点点的重建的,因为每个二叉树的深度都有可能不同,可能无限大,也可能很小。所以一定要用递归的思维去解决,用递归,就要把思维从无数的细节中抽离出来,从宏观去看待问题。
我们根据前序遍历和中序遍历的结果,就可以锁定根的位置、左子树的范围、右子树的范围。这就够了,因为左右子树也要符合遍历规则。只需要用相同的方法继续对左右子树进行重建即可。
总之,这道题就是在用代码找 根、左子树、右子树的位置。
3、代码
import java.util.*; /** * 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.length == 0||in.length == 0){ return null; } TreeNode node = new TreeNode(pre[0]); //扫描中序遍历结果,确定左右子树的位置 for(int i = 0; i < in.length; i++){ if(pre[0] == in[i]){ node.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i+1), Arrays.copyOfRange(in, 0, i)); node.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i+1, pre.length), Arrays.copyOfRange(in, i+1,in.length)); } } return node; } }