解法一:递归

后序遍历序列末尾存储根结点,找出其在中序遍历中的位置,即可从源遍历序列中划分出左右子树的范围,递归建树。

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11. public TreeNode buildTree(int[] inorder, int[] postorder) {
  12. return build(inorder, 0, inorder.length, postorder, 0, postorder.length);
  13. }
  14. private TreeNode build(final int[] inorder, int inBegin, int inEnd, final int[] postorder, int postBegin, int postEnd) {
  15. if ((inBegin >= inEnd) || (postBegin >= postEnd)) {
  16. return null;
  17. }
  18. // 后序遍历数组末尾为根结点
  19. int val = postorder[postEnd - 1];
  20. TreeNode root = new TreeNode(val);
  21. // 寻找中序遍历数组中根结点的位置
  22. int rootIndex = 0;
  23. for (int i = inBegin; i < inEnd; ++i) {
  24. if (inorder[i] == val) {
  25. rootIndex = i;
  26. break;
  27. }
  28. }
  29. int len = rootIndex - inBegin;
  30. // 划分左右子树的范围, 递归建树
  31. root.left = build(inorder, inBegin, rootIndex, postorder, postBegin, postBegin + len);
  32. root.right = build(inorder, rootIndex + 1, inEnd, postorder, postBegin + len, postEnd - 1);
  33. return root;
  34. }
  35. }