首先需要确定,在前序遍历中,第一个节点为根节点,则根据根节点,可以在中序遍历中划分左右子树
在左右子树中,前序遍历的第一个节点为根节点,再继续划分左右子树
//根据前序遍历和中序遍历构建二叉树
public TreeNode buildTree(int[] preorder, int[] inorder) {
return buildTreeCore(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}
public TreeNode buildTreeCore(int[] preorder,int pLeft,int pRight,int[] inorder,int iLeft,int iRight) {
if (pLeft > pRight || iLeft > iRight) return null;
int i = 0;
for (i = iLeft; i <= iRight; ++i) {
if (preorder[pLeft] == inorder[i]) break;
}
TreeNode cur = new TreeNode(preorder[pLeft]);
cur.left = buildTreeCore(preorder, pLeft + 1, pLeft + i - iLeft, inorder, iLeft, i - 1);
cur.right = buildTreeCore(preorder, pLeft + i - iLeft + 1, pRight, inorder, i + 1, iRight);
return cur;
}