递归
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { /** 先序:中左右 中序: 左中右 后续:左右中 先序遍历第一位为根节点 // 根据 idx 来递归找左右子树 root.left = helper(preorder, preLeft + 1, preLeft + (idx - inLeft), inorder, inLeft, idx - 1); root.right = helper(preorder, preLeft + (idx - inLeft) + 1, preRight, inorder, idx + 1, inRight); */ return buildTree(preorder,0,preorder.length, inorder,0,inorder.length); } public TreeNode buildTree(int[] preorder,int preL,int preR, int[] inorder, int inL, int inR ) { if(inR - inL < 1) return null; if(inR - inL == 1 ) return new TreeNode(inorder[inL]); int rootVal = preorder[preL]; //根节点在中序数组中的位置 int rootIndex = inL; for(int i = inL; i < inR; i++ ) { if(inorder[i] == rootVal ) { rootIndex = i; break; } } TreeNode root = new TreeNode(rootVal); root.left = buildTree(preorder,preL + 1,preL + (rootIndex - inL), inorder,inL,rootIndex); root.right = buildTree(preorder,preL + (rootIndex - inL) + 1, preR, inorder,rootIndex + 1,inR); return root; }}