📑 题目:105. 从前序与中序遍历序列构造二叉树

🚀 本题 LeetCode 传送门

题目大意

根据一棵树的前序遍历与中序遍历构造二叉树。

注意: 你可以假设树中没有重复的元素。

解题思路

  • 给出 2 个数组,根据 preorder 和 inorder 数组构造一颗树。
  • 利用递归思想,从 preorder 可以得到根节点,从 inorder 中得到左子树和右子树。只剩一个节点的时候即为根节点。不断的递归直到所有的树都生成完成。

代码

  1. package leetcode
  2. import (
  3. ""github.com/halfrost/LeetCode-Go/structures""
  4. )
  5. // TreeNode define
  6. type TreeNode = structures.TreeNode
  7. /**
  8. * Definition for a binary tree node.
  9. * type TreeNode struct {
  10. * Val int
  11. * Left *TreeNode
  12. * Right *TreeNode
  13. * }
  14. */
  15. // 解法一, 直接传入需要的 slice 范围作为输入, 可以避免申请对应 inorder 索引的内存, 内存使用(leetcode test case) 4.7MB -> 4.3MB.
  16. func buildTree(preorder []int, inorder []int) *TreeNode {
  17. if len(preorder) == 0 {
  18. return nil
  19. }
  20. root := &TreeNode{Val: preorder[0]}
  21. for pos, node := range inorder {
  22. if node == root.Val {
  23. root.Left = buildTree(preorder[1:pos+1], inorder[:pos])
  24. root.Right = buildTree(preorder[pos+1:], inorder[pos+1:])
  25. }
  26. }
  27. return root
  28. }
  29. // 解法二
  30. func buildTree1(preorder []int, inorder []int) *TreeNode {
  31. inPos := make(map[int]int)
  32. for i := 0; i < len(inorder); i++ {
  33. inPos[inorder[i]] = i
  34. }
  35. return buildPreIn2TreeDFS(preorder, 0, len(preorder)-1, 0, inPos)
  36. }
  37. func buildPreIn2TreeDFS(pre []int, preStart int, preEnd int, inStart int, inPos map[int]int) *TreeNode {
  38. if preStart > preEnd {
  39. return nil
  40. }
  41. root := &TreeNode{Val: pre[preStart]}
  42. rootIdx := inPos[pre[preStart]]
  43. leftLen := rootIdx - inStart
  44. root.Left = buildPreIn2TreeDFS(pre, preStart+1, preStart+leftLen, inStart, inPos)
  45. root.Right = buildPreIn2TreeDFS(pre, preStart+leftLen+1, preEnd, rootIdx+1, inPos)
  46. return root
  47. }