1、重要的一点就是顺序,前序,根左右,中序,左根右
2、先考虑添加根节点(通过前序完成),而后考虑添加左边,再添加右边的(这都是废话),其实主要的就是分界线,对于中序来说就是分界的,找到前序中对应到中序的位置就是根,如下图:
图片说明
3、所以,前序确定根,中序确定左右
4、然后就是考虑如何划分左右,可以利用循环找出中序的根所在位置,然后将数组一分为二,我感觉是利用了二分法的思想的。

5、递归,就是自己多谢,多分析,多练,左边的考虑了,就考虑右边的怎么来的,在已有的情况还不一样,最不好确定的就是pre数组的下标,根据程序自己带入一下,我也是个菜鸟,就给和我一样的人说一下,程序没有一下就能分析好的,多写两次就好了。
先来一个错误示范
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length == 0 || pre.length != in.length){
return null;
}
TreeNode root = null;
root = BuildBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
return root;
}
public TreeNode BuildBinaryTree(int[] pre,int preleft,int last,int[] in,int left,int right){
if(preleft > last || left > right){
return null;
}
TreeNode root = new TreeNode(pre[preleft]);
int root_index = 0;
for(; root_index < right; root_index++){
** if(in[root_index] == pre[preleft]){**
** root.left = BuildBinaryTree(pre,preleft+1,preleft+root_index-left,in,left,root_index-1);**
** root.right = BuildBinaryTree(pre,preleft+root_index-left+1,last,in,root_index+1,right);**
** }**就是这个循环,我怎么分析都不知道错在了那里,我就感觉对的呀,但是答案就是只对了一部分,没有100通过;后来我明白了,因为for循环是会有影响的,具体咋影响的,我也不知道,如果有人看见并且知道了,和我说一下,感激!!!
}

    return root;
}

}

正确的代码:我就是修改了下标值,然后解释一下,while循环就是确定中序数组中的根的位置,因为root_indexs是自加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.length == 0 || pre.length != in.length){
          return null;
      }
      TreeNode root = null;
      root = BuildBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
      return root;
    }
    public TreeNode BuildBinaryTree(int[] pre,int preleft,int last,int[] in,int left,int right){
      if(preleft > last  || left > right){
          return null;
      }
      TreeNode root = new TreeNode(pre[preleft]);
      int root_index = left;
      while(root_index <= right && in[root_index++] != pre[preleft]);
        --root_index;//中序遍历中头节点下标遍历    
        root.left = BuildBinaryTree(pre,preleft+1,preleft+root_index-left,in,left,root_index-1);
        root.right = BuildBinaryTree(pre,preleft+root_index-left+1,last,in,root_index+1,right); 
         return root;
    }

}