diff --git "a/lcof/\351\235\242\350\257\225\351\242\23007. \351\207\215\345\273\272\344\272\214\345\217\211\346\240\221/README.md" "b/lcof/\351\235\242\350\257\225\351\242\23007. \351\207\215\345\273\272\344\272\214\345\217\211\346\240\221/README.md" index 263aca7eda016b88ed1462b25cfc6e1b63f7d179..bb9c74c431d6070e491b9eda49b40cf4bd72957c 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23007. \351\207\215\345\273\272\344\272\214\345\217\211\346\240\221/README.md" +++ "b/lcof/\351\235\242\350\257\225\351\242\23007. \351\207\215\345\273\272\344\272\214\345\217\211\346\240\221/README.md" @@ -105,6 +105,64 @@ class Solution { } ``` +分解式: +```java +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +class Solution { + public TreeNode buildTree(int[] preorder, int[] inorder) { + if (preorder == null || preorder.length <= 0 || inorder == null || inorder.length <= 0){ + return null; + } + return rebuild(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1); + } + + public TreeNode rebuild(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd){ + if (preStart > preEnd || inStart > inEnd || preStart > preorder.length - 1 || preEnd < 0 || inStart > inorder.length - 1 || inEnd < 0){ + return null; + } + + // 前序遍历的首个元素为根节点 + int root = preorder[preStart]; + int rootLocIn = findLocationIn(inorder, inStart, inEnd, root); + + int leftLen = (rootLocIn - 1) - inStart + 1; + int rightLen = inEnd - (rootLocIn + 1) + 1; + + int leftPreStart = preStart + 1; + int leftPreEnd = leftPreStart + leftLen - 1; + int leftInStart = inStart; + int leftInEnd = rootLocIn - 1; + + int rightPreStart = leftPreEnd + 1; + int rightPreEnd = rightPreStart + rightLen - 1; + int rightInStart = rootLocIn + 1; + int rightInEnd = inEnd; + + TreeNode node = new TreeNode(root); + node.left = rebuild(preorder, inorder, leftPreStart, leftPreEnd, leftInStart, leftInEnd); + node.right = rebuild(preorder, inorder, rightPreStart, rightPreEnd, rightInStart, rightInEnd); + return node; + } + + private int findLocationIn(int[] inorder, int inStart, int inEnd, int val){ + for (int i = inStart; i <= inEnd; i++){ + if (inorder[i] == val){ + return i; + } + } + return -1; + } +} +``` + ### **JavaScript** ```js