|
| 1 | +package com.leosanqing.leetcode.medium.tree; |
| 2 | + |
| 3 | +/** |
| 4 | + * @Author: rtliu |
| 5 | + * @Date: 2020/7/28 下午7:29 |
| 6 | + * @Package: com.leosanqing.leetcode.medium.tree |
| 7 | + * @Description: 1 |
| 8 | + * ` Given preorder and inorder traversal of a tree, construct the binary tree. |
| 9 | + * ` Note: You may assume that duplicates do not exist in the tree. |
| 10 | + * ` For example, given preorder = [3,9,20,15,7] inorder = [9,3,15,20,7] |
| 11 | + * ` Return the following binary tree: |
| 12 | + * ` |
| 13 | + * ` 给定一棵树的前序和有序遍历,构造二叉树。 |
| 14 | + * ` 注意:您可以假定树中不存在重复项。 |
| 15 | + * ` 例如,给定的先序遍历 = [3,9,20,15,7] 中序遍历 = [9,3,15,20,7] |
| 16 | + * ` 3 |
| 17 | + * ` / \ |
| 18 | + * ` 9 20 |
| 19 | + * ` / \ |
| 20 | + * ` 15 7 |
| 21 | + * @Version: 1.0 |
| 22 | + */ |
| 23 | +public class _105_construct_binary_tree_from_preorder_and_inorder_traversal { |
| 24 | + |
| 25 | + public static void main(String[] args) { |
| 26 | + int[] preorder = {3, 9, 2, 11, 14, 8, 20, 15, 16, 7, 22}; |
| 27 | + int[] inorder = {11, 2, 14, 9, 8, 3, 16, 15, 20, 22, 7}; |
| 28 | + |
| 29 | + |
| 30 | + TreeNode treeNode1 = backTrace(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1); |
| 31 | + |
| 32 | + |
| 33 | + TreeNode treeNode = buildTree(preorder, inorder); |
| 34 | + |
| 35 | + |
| 36 | + } |
| 37 | + |
| 38 | + public static TreeNode buildTree(int[] preorder, int[] inorder) { |
| 39 | + return backTrace(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1); |
| 40 | + } |
| 41 | + |
| 42 | + private static TreeNode backTrace(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd) { |
| 43 | + if (preStart > preorder.length - 1 || inStart > inEnd) { |
| 44 | + return null; |
| 45 | + } |
| 46 | + |
| 47 | + TreeNode root = new TreeNode(preorder[preStart]); |
| 48 | + // 找到 inOrder 中 的索引 |
| 49 | + int inIndex = 0; |
| 50 | + |
| 51 | + for (int i = inStart; i <= inEnd; i++) { |
| 52 | + if (root.val == inorder[i]) { |
| 53 | + inIndex = i; |
| 54 | + } |
| 55 | + } |
| 56 | + |
| 57 | + root.left = backTrace(preorder, preStart + 1, preEnd, inorder, inStart, inIndex - 1); |
| 58 | + root.right = backTrace(preorder, preStart + inIndex - inStart + 1, preEnd, inorder, inIndex + 1, inEnd); |
| 59 | + return root; |
| 60 | + } |
| 61 | +} |
0 commit comments