105 又错了一次

Leetcode 106 105
https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

Example 1: Input: inorder = [9,3,15,20,7], postorder = [9,15,7,20,3] Output: [3,9,20,null,null,15,7]

Example 2: Input: inorder = [-1], postorder = [-1] Output: [-1]

  1. //Recursion 106
  2. class Solution {
  3. public TreeNode buildTree(int[] inorder, int[] postorder) {
  4. return Traverse(inorder, 0, inorder.length, postorder, 0, postorder.length);
  5. }
  6. public TreeNode Traverse(int[] inorder, int inLeft, int inRight, int[] postorder, int postLeft, int postRight){
  7. if(inRight - inLeft < 1){
  8. return null;
  9. }
  10. if(inRight - inLeft == 1){
  11. return new TreeNode(inorder[inLeft]);
  12. }
  13. //postorder last node as root
  14. int rootVal = postorder[postRight - 1];
  15. TreeNode root = new TreeNode(rootVal);
  16. int rootIndex = 0;
  17. for(int i = inLeft; i < inRight; i++){
  18. if(inorder[i] == rootVal){
  19. rootIndex = i;
  20. break;
  21. }
  22. }
  23. root.left = Traverse(inorder, inLeft, rootIndex, postorder, postLeft, postLeft + rootIndex - inLeft);
  24. root.right = Traverse(inorder, rootIndex + 1, inRight, postorder, postLeft + rootIndex - inLeft, postRight - 1);
  25. return root;
  26. }
  27. }
  1. //105
  2. class Solution {
  3. public TreeNode buildTree(int[] preorder, int[] inorder) {
  4. return helper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
  5. }
  6. public TreeNode helper(int[] preorder, int preLeft, int preRight,
  7. int[] inorder, int inLeft, int inRight) {
  8. // 递归终止条件
  9. if (inLeft > inRight || preLeft > preRight) return null;
  10. // val 为前序遍历第一个的值,也即是根节点的值
  11. // idx 为根据根节点的值来找中序遍历的下标
  12. int idx = inLeft, val = preorder[preLeft];
  13. TreeNode root = new TreeNode(val);
  14. for (int i = inLeft; i <= inRight; i++) {
  15. if (inorder[i] == val) {
  16. idx = i;
  17. break;
  18. }
  19. }
  20. // 根据 idx 来递归找左右子树
  21. root.left = helper(preorder, preLeft + 1, preLeft + (idx - inLeft),
  22. inorder, inLeft, idx - 1);
  23. root.right = helper(preorder, preLeft + (idx - inLeft) + 1, preRight,
  24. inorder, idx + 1, inRight);
  25. return root;
  26. }
  27. }