题意:

image.png

解题思路:

  1. 思路:
  2. 递归(dfs):O(n):树中的每个节点遍历一次
  3. 1. 先利用前序遍历找根节点:前序遍历的第一个数,就是根节点的值;
  4. 2. 在中序遍历中找到根节点的位置 kk,则 kk 左边是左子树的中序遍历,右边是右子树的中序遍历;
  5. 3. 假设左子树的中序遍历的长度是 ll,则在前序遍历中,根节点后面的 ll 个数,是左子树的前序遍历,剩下的数是右子树的前序遍历;
  6. 4. 有了左右子树的前序遍历和中序遍历,我们可以先递归创建出左右子树,然后再创建根节点;

PHP代码实现:

  1. /**
  2. * Definition for a binary tree node.
  3. * class TreeNode {
  4. * public $val = null;
  5. * public $left = null;
  6. * public $right = null;
  7. * function __construct($value) { $this->val = $value; }
  8. * }
  9. */
  10. class Solution {
  11. /**
  12. * @param Integer[] $preorder
  13. * @param Integer[] $inorder
  14. * @return TreeNode
  15. */
  16. function buildTree($preorder, $inorder) {
  17. if (!$preorder) return null;
  18. $x = array_shift($preorder);
  19. $node = new TreeNode($x);
  20. $key = array_search($x, $inorder);
  21. $node->left = $this->buildTree(array_slice($preorder, 0, $key), array_slice($inorder, 0, $key));
  22. $node->right = $this->buildTree(array_slice($preorder, $key), array_slice($inorder, $key + 1));
  23. return $node;
  24. }
  25. }

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(preorder []int, inorder []int) *TreeNode {
  10. if len(preorder) == 0 {
  11. return nil
  12. }
  13. rootVal := preorder[0]
  14. i := 0
  15. // 查找根节点位置
  16. for ; i < len(inorder); i++ {
  17. if rootVal == inorder[i] {
  18. break
  19. }
  20. }
  21. root := &TreeNode{Val: rootVal}
  22. root.Left = buildTree(preorder[1:i+1], inorder[:i])
  23. root.Right = buildTree(preorder[i+1:], inorder[i+1:])
  24. return root
  25. }