难度:中等
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
【例】
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
【解】树的问题绝大多数都使用递归解决
class Solution {
HashMap<Integer, Integer> map = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder.length == 0) return null;
// 将中序遍历的数组和下标挂钩,可以快速通过值找到下标,目的是建立前序遍历和中序遍历根节点的关系
for (int i = 0; i < inorder.length; i++) {
map.put(inorder[i], i);
}
return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
}
private TreeNode buildTree(int[] preorder, int[] inorder, int preLeft, int preRight, int inLeft, int inRight) {
// 递归的结束条件,数组中没有元素,无法再被当做一个节点,返回null
if (preRight - preLeft + 1 <= 0) return null;
TreeNode root = new TreeNode(preorder[preLeft]);
int index = map.get(root.val);
int leftLength = index - inLeft;
root.left = buildTree(preorder, inorder, preLeft + 1, preLeft + leftLength, inLeft, index - 1);
root.right = buildTree(preorder, inorder, preLeft + leftLength + 1, preRight, index + 1, inRight);
return root;
}
}