先找根节点,即前序遍历的第一个元素。
再找根节点在中序遍历中的索引,将前序、中序遍历划分为两半,来递归构造左右子树。
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return build(preorder, 0, preorder.length - 1,
inorder, 0, inorder.length - 1);
}
// 构造二叉树
private TreeNode build(int[] preorder, int preStart, int preEnd,
int[] inorder, int inStart, int inEnd) {
if (preStart > preEnd) return null;
// 先找根节点
int rootVal = preorder[preStart];
TreeNode root = new TreeNode(rootVal);
// 再找根节点在中序遍历中的索引
int index = 0;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == rootVal) {
index = i;
break;
}
}
// 递归构造左右子树
int leftSize = index - inStart;
root.left = build(preorder, preStart + 1, preStart + leftSize,
inorder, inStart, index - 1);
root.right = build(preorder, preStart + leftSize + 1, preEnd,
inorder, index + 1, inEnd);
return root;
}
}