105.从前序与中序遍历序列构造二叉树
思路:
- 通过前序遍历数组的第一个元素得出根节点,并在中序遍历数组中找到根节点,该数组根节点位置左边是左子树,右边是右子树
- 为了创建左右子树,通过中序数组得出左子树和右子树的范围后,到前序数组中找到左右子树范围并继续获得根节点。想要构建最开始的左右子树,就得构建该左右子树下面的左右子树,依次类推
- 通过前两点的分析,可以考虑使用递归创建左子树和右子树,此时考虑递归三要素:(1).递归函数的参数和返回值 (2).终止条件 (3).单层递归的逻辑
- 参数应为左右子树的数组下标,返回值应该为二叉树,终止条件是 原本偏小的下标 比 原本偏大的下标 大。递归逻辑上面分析过了
代码实现
class Solution {
HashMap<Integer, Integer> inorderHashMap = new HashMap<Integer, Integer>();
int[] pre;
public TreeNode buildTree(int[] preorder, int[] inorder) {
for (int i = 0; i < inorder.length; i++) {
inorderHashMap.put(inorder[i], i);
}
pre = preorder;
return buildTree(0, inorder.length - 1, 0, preorder.length - 1);
}
public TreeNode buildTree(int is, int ie, int ps, int pe) {
if (is > ie || ps > pe) return null;
int root = pre[ps];
int i = inorderHashMap.get(root);
TreeNode node = new TreeNode(root);
node.left = buildTree(is, i - 1, ps + 1, ps + i - is);
node.right = buildTree(i + 1, ie, ps + i - is + 1, pe);
return node;
}
}