package class06; import java.util.HashMap; //测试链接:https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal public class Code05_ConstructBinaryTreeFromPreorderAndInorderTraversal { public static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } } public static TreeNode buildTree1(int[] pre, int[] in) { if (pre == null || in == null || pre.length != in.length) { return null; } return f(pre, 0, pre.length - 1, in, 0, in.length - 1); } // 有一棵树,先序结果是pre[L1...R1],中序结果是in[L2...R2] // 请建出整棵树返回头节点 public static TreeNode f(int[] pre, int L1, int R1, int[] in, int L2, int R2) { if (L1 > R1) { return null; } TreeNode head = new TreeNode(pre[L1]); if (L1 == R1) { return head; } int find = L2; while (in[find] != pre[L1]) { find++; } head.left = f(pre, L1 + 1, L1 + find - L2, in, L2, find - 1); head.right = f(pre, L1 + find - L2 + 1, R1, in, find + 1, R2); return head; } public static TreeNode buildTree2(int[] pre, int[] in) { if (pre == null || in == null || pre.length != in.length) { return null; } HashMap valueIndexMap = new HashMap<>(); for (int i = 0; i < in.length; i++) { valueIndexMap.put(in[i], i); } return g(pre, 0, pre.length - 1, in, 0, in.length - 1, valueIndexMap); } // 有一棵树,先序结果是pre[L1...R1],中序结果是in[L2...R2] // 请建出整棵树返回头节点 public static TreeNode g(int[] pre, int L1, int R1, int[] in, int L2, int R2, HashMap valueIndexMap) { if (L1 > R1) { return null; } TreeNode head = new TreeNode(pre[L1]); if (L1 == R1) { return head; } int find = valueIndexMap.get(pre[L1]); head.left = g(pre, L1 + 1, L1 + find - L2, in, L2, find - 1, valueIndexMap); head.right = g(pre, L1 + find - L2 + 1, R1, in, find + 1, R2, valueIndexMap); return head; } }