题意:

image.png

解题思路:

  1. 思路:
  2. 递归(dfs):创建每个节点需要的时间是 O(1),所以总时间复杂度是 O(n)
  3. 1. 先利用后序遍历找根节点:后序遍历的最后一个数,就是根节点的值;
  4. 2. 在中序遍历中找到根节点的位置 k,则 k 左边是左子树的中序遍历,右边是右子树的中序遍历;
  5. 3. 假设左子树的中序遍历的长度是 l,则在后序遍历中,前 l 个数就是左子树的后序遍历,接下来的数除了最后一个,就是右子树的后序遍历;
  6. 4. 有了左右子树的后序遍历和中序遍历,我们可以先递归创建出左右子树,然后再创建根节点;

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $inorder
  4. * @param Integer[] $postorder
  5. * @return TreeNode
  6. */
  7. function buildTree($inorder, $postorder) {
  8. if (!$postorder) return null;
  9. $x = array_pop($postorder);
  10. $node = new TreeNode($x);
  11. $key = array_search($x, $inorder);
  12. $node->left = $this->buildTree(array_slice($inorder, 0, $key), array_slice($postorder, 0, $key));
  13. $node->right = $this->buildTree(array_slice($inorder, $key + 1), array_slice($postorder, $key));
  14. return $node;
  15. }

GO代码实现:

  1. /**
  2. * Definition for a binary tree node.
  3. * type TreeNode struct {
  4. * Val int
  5. * Left *TreeNode
  6. * Right *TreeNode
  7. * }
  8. */
  9. func buildTree(inorder []int, postorder []int) *TreeNode {
  10. length := len(postorder)
  11. if length == 0 {
  12. return nil
  13. }
  14. root := &TreeNode {
  15. Val: postorder[length-1],
  16. }
  17. index := 0
  18. for i, value := range inorder {
  19. if value == root.Val {
  20. index = i
  21. break
  22. }
  23. }
  24. root.Left = buildTree(inorder[:index], postorder[:index])
  25. root.Right = buildTree(inorder[index+1:], postorder[index:length-1])
  26. return root
  27. }