Construct Binary Tree from Inorder and Postorder Traversal

Question

  1. Given inorder and postorder traversal of a tree, construct the binary tree.
  2. Example
  3. Given inorder [1,2,3] and postorder [1,3,2], return a tree:
  4. 2
  5. / \
  6. 1 3
  7. Note
  8. You may assume that duplicates do not exist in the tree.

题解

和题 Construct Binary Tree from Preorder and Inorder Traversal 几乎一致,关键在于找到中序遍历中的根节点和左右子树,递归解决。

Java

  1. /**
  2. * Definition of TreeNode:
  3. * public class TreeNode {
  4. * public int val;
  5. * public TreeNode left, right;
  6. * public TreeNode(int val) {
  7. * this.val = val;
  8. * this.left = this.right = null;
  9. * }
  10. * }
  11. */
  12. public class Solution {
  13. /**
  14. *@param inorder : A list of integers that inorder traversal of a tree
  15. *@param postorder : A list of integers that postorder traversal of a tree
  16. *@return : Root of a tree
  17. */
  18. public TreeNode buildTree(int[] inorder, int[] postorder) {
  19. if (inorder == null || postorder == null) return null;
  20. if (inorder.length == 0 || postorder.length == 0) return null;
  21. if (inorder.length != postorder.length) return null;
  22. TreeNode root = helper(inorder, 0, inorder.length - 1,
  23. postorder, 0, postorder.length - 1);
  24. return root;
  25. }
  26. private TreeNode helper(int[] inorder, int instart, int inend,
  27. int[] postorder, int poststart, int postend) {
  28. // corner cases
  29. if (instart > inend || poststart > postend) return null;
  30. // build root TreeNode
  31. int root_val = postorder[postend];
  32. TreeNode root = new TreeNode(root_val);
  33. // find index of root_val in inorder[]
  34. int index = findIndex(inorder, instart, inend, root_val);
  35. // build left subtree
  36. root.left = helper(inorder, instart, index - 1,
  37. postorder, poststart, poststart + index - instart - 1);
  38. // build right subtree
  39. root.right = helper(inorder, index + 1, inend,
  40. postorder, poststart + index - instart, postend - 1);
  41. return root;
  42. }
  43. private int findIndex(int[] nums, int start, int end, int target) {
  44. for (int i = start; i <= end; i++) {
  45. if (nums[i] == target) return i;
  46. }
  47. return -1;
  48. }
  49. }

源码分析

找根节点的方法作为私有方法,辅助函数需要注意索引范围。

复杂度分析

找根节点近似 O(n), 递归遍历整个数组,嵌套找根节点的方法,故总的时间复杂度为 O(n^2).