1.leetCode第105(剑指07)题
- 题目如下:
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字:
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
二叉树如下:
- 可以使用递归来完成这一题:
二叉树前序遍历顺序:当前结点→左子树→右子树;
二叉树中序遍历顺序:当前节点左子树→当前结点右子树→当前结点;
对于树的中序遍历来说,根节点左侧存储的结点都是该结点左子树所包含的结点,而前序遍历的第一个结点便是二叉树的根节点。所以可以在前序遍历之中获取根节点,之后可以得到根节点在中序遍历之中的位置,最后确定跟结点左右子树所包含的结点。
public class Solution {
Map<Integer, Integer> map = new HashMap<>();
public TreeNode buildTree (int[] preorder, int[] inorder) {
int n = inorder.length;
for (int i = 0; i < n; i++) {
map.put(inorder[i], i);
}
return dfs(preorder, inorder, 0, n - 1, 0, n - 1);
}
public TreeNode dfs (int[] preorder, int[] inorder, int p_left, int p_right, int i_left, int i_right) {
if (p_left > p_right) {
return null;
}
int preoder_root = p_left;
int inorder_root = map.get(preorder[preoder_root]);
TreeNode root = new TreeNode(preorder[preoder_root]);
int num_left_tree = inorder_root - i_left;
root.left = dfs(preorder, inorder, p_left + 1, p_left + num_left_tree, i_left, inorder_root - 1);
root.right = dfs(preorder, inorder, p_left + num_left_tree + 1, p_right, inorder_root + 1, i_right);
return root;
}
}