这三道构造二叉树的题,核心都是分治。区别只在前序/中序/后序的组合方式。105和106基本可以照搬,889需要额外注意一下。我把代码和要点整理在这里。
105. 从前序与中序遍历构造二叉树
原题链接:LeetCode 105
给定两个数组 preorder 和 inorder,数组元素不重复,要求重建二叉树并返回根节点。
示例:
preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
preorder = [-1], inorder = [-1]
输出: [-1]
提示:数组长度 1~3000,元素值在 [-3000, 3000],inorder 和 preorder 中的值一一对应,且保证是合法的遍历序列。
思路很简单:前序的第一个元素是根,在中序中找到这个根的位置,左边就是左子树的中序序列,右边就是右子树的中序序列。然后递归处理左右子树,左右边界相交时返回 null。
代码:
class Solution {
int index = 0; // 当前在前序中的位置
public TreeNode buildTree(int[] preorder, int[] inorder) {
return dfs(preorder, inorder, 0, preorder.length - 1);
}
public TreeNode dfs(int[] preorder, int[] inorder, int left, int right) {
if (left > right) {
;
}
;
( left; i <= right; i++) {
(inorder[i] == preorder[index]) {
mid = i;
;
}
}
(preorder[index]);
index++;
root.left = dfs(preorder, inorder, left, mid - );
root.right = dfs(preorder, inorder, mid + , right);
root;
}
}


