【Leetcode】105. 从前序与中序遍历序列构造二叉树

93 阅读1分钟

题目描述

在这里插入图片描述

// 105. 从前序与中序遍历序列构造二叉树


// 根据一棵树的前序遍历与中序遍历构造二叉树。

// 注意:
// 你可以假设树中没有重复的元素。

// 例如,给出

// 前序遍历 preorder = [3,9,20,15,7]
// 中序遍历 inorder = [9,3,15,20,7]
// 返回如下的二叉树:

    // 3
   // / \
  // 9  20
    // /  \
   // 15   7

题解

/**
 * 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;
 *     }
 * }
 */



// 本题和【剑指offer】07. 重建二叉树 一模一样
//
// 执行用时:2 ms, 在所有 Java 提交中击败了98.29%的用户
// 内存消耗:38.6 MB, 在所有 Java 提交中击败了44.28%的用户q
class Solution {
	public Map<Integer, Integer> inOrderIndex = new HashMap<>();

    public TreeNode buildTree(int[] preorder, int[] inorder) {
		if (preorder.length == 0 || inorder.length == 0)
			return null;
			
		for (int i = 0; i < inorder.length; i++)
			inOrderIndex.put(inorder[i], i);
		return buildTree(preorder, 0, preorder.length - 1, 0);
    }
	
	private TreeNode buildTree(int[] pre, int preL, int preR, int inL) {
		if (preL > preR)
			return null;
		TreeNode root = new TreeNode(pre[preL]);
		int inIndex = inOrderIndex.get(pre[preL]);
		int leftTreeSize = inIndex - inL;
		root.left = buildTree(pre, preL + 1, preL + leftTreeSize, inL);
		root.right = buildTree(pre, preL + leftTreeSize + 1, preR, inL + leftTreeSize + 1);
		return root;
	}
}