这三道题的解法类似,都是基于分治思想,不断划分左右子树进行解答。题 1 和题 2 解法几乎完全相同,题 3 根据前序后序遍历的话需要加以注意,后面详细讲解。
LeetCode-105. 从前序与中序遍历序列构造二叉树
题目描述
给定两个整数数组 preorder 和 inorder:
preorder是二叉树的 前序遍历 序列。inorder是同一棵树的 中序遍历 序列。
请根据这两个数组 构造 出该二叉树,并返回其根节点。
示例展示
示例 1:
输入:
preorder = [3, 9, 20, 15, 7],inorder = [9, 3, 15, 20, 7]输出:
[3, 9, 20, null, null, 15, 7]
示例 2:
输入:
preorder = [-1],inorder = [-1]输出:
[-1]
提示条件
1 <= preorder.length <= 3000inorder.length == preorder.length-3000 <= preorder[i], inorder[i] <= 3000preorder和inorder均 无重复 元素。inorder中的所有元素均出现在preorder中。preorder保证为二叉树的前序遍历序列。inorder保证为二叉树的中序遍历序列。
解题思路
根据前序遍历和中序遍历的特点可知,前序遍历是 中->左->右,中序遍历是 左 ->中->右。那根据两个遍历的特点,我们就可以想到:通过前序遍历来确定中间节点,然后通过中序遍历来划分左右节点,然后通过回溯把树串起来即可。直接上代码展示。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
{
;
TreeNode {
dfs(preorder, inorder, , preorder.length - );
}
TreeNode {
(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;
}
}


