解题心得:
1、一个要清楚什么时候停止创建TreeNode,就是pre.size() ,vin.size()都为空时;
2、一个是要注意下标的选取,容易选错导致整个算法异常,只要对着笔记本上画出来的标识来看就没有任何问题!
root.left = reConstructBinaryTree( Arrays.copyOfRange(preOrder, 1, i+1), Arrays.copyOfRange(vinOrder, 0, i)); root.right = reConstructBinaryTree( Arrays.copyOfRange(preOrder, i+1, n), Arrays.copyOfRange(vinOrder, i+1, n));
解题思路:
1、判断传入的pre、vin数组长度是否为0,若是返回null
2、创建新的根节点,
3、for循环找出根节点,在中序数组的位置,截取左右子节点的pre、vin数组递归,
4、最后返回整个root节点。
import java.util.*; public class Solution { /** * 根据前序、中序数组重构二叉树 * @param preOrder int整型一维数组 * @param vinOrder int整型一维数组 * @return TreeNode类 */ public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) { // 前序和中序数组为空说明到叶子节点底了 // 直接返回空节点填充叶子节点的叶子 int m = preOrder.length; int n = vinOrder.length; if(m == 0 || n == 0) { return null; } // 创建根节点 TreeNode root = new TreeNode(preOrder[0]); for(int i=0; i<n; i++) { // 找到左右子节点的前序、中序数组递归 if(preOrder[0]==vinOrder[i]) { root.left = reConstructBinaryTree( Arrays.copyOfRange(preOrder, 1, i+1), Arrays.copyOfRange(vinOrder, 0, i)); root.right = reConstructBinaryTree( Arrays.copyOfRange(preOrder, i+1, n), Arrays.copyOfRange(vinOrder, i+1, n)); break; } } return root; } }