LeetCode 7天刷题挑战: 105. 从前序与中序遍历序列构造二叉树
前序 + 后序遍历 重建二叉树
解法: 朴素递归
前序: 根 左 右
中序: 左 根 右
思路:
通过前序遍历确定根节点, 通过中序遍历确定该根节点下的左子树, 右子树
AC Code
/**
* 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;
* }
* }
*/
class Solution {
Map<Integer, Integer> map = new HashMap<>();
public TreeNode buildTree(int[] pre, int[] ino) {
// [3,9,20,15,7] 根 左 右
// [9,3,15,20,7] 左 根 右
int len = ino.length;
for(int i = 0; i < len; i++) map.put(ino[i], i);
TreeNode root = creatTree(pre, 0, len - 1, 0, len - 1);
return root;
}
public TreeNode creatTree(int[] pre, int pl, int pr, int il, int ir) {
if(pl > pr) return null;
// 中序遍历中的根节点位置
int idx = map.get(pre[pl]);
TreeNode root = new TreeNode(pre[pl]);
root.left = creatTree(pre, pl + 1, pl + (idx - il), il, idx - 1);
root.right = creatTree(pre, pl + (idx - il) + 1, pr, idx + 1, ir);
return root;
}
}