剑指 Offer 07. 重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

输入输出

1
2
3
4
5
6
7
8
        3
/ \
9 20
/ \
15 7

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

基本思路

左子树根节点 = 先序根节点坐标 + 1

右子树根节点 = (中序根节点坐标 - 中序左边界)+ 先序根节点坐标 + 1

同时为了提升效率使用一个HashMap存储中序遍历的值和索引的映射 使查找时间复杂度O(1)

java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int[] preorder;
HashMap<Integer, Integer> dic = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder = preorder;
for(int i = 0; i < inorder.length; i++){
dic.put(inorder[i], i);
}
return recur(0, 0, inorder.length -1);
}
TreeNode recur(int root, int left, int right){
if(left > right) return null;
TreeNode node = new TreeNode(preorder[root]);
int i = dic.get(preorder[root]);
node.left = recur(root + 1, left, i - 1);
node.right = recur(i - left + root + 1, i + 1, right);
return node;
}
}