617. 合并二叉树

image.png
image.png

解题思路
看了都是递归来递归去的,已经成为套公式题了,真的没劲的很,实际上迭代方式实现也很简单,可以自动动手画一个队列,亲自动手入队出队 很容易理解的,如果无法什么理解队列请到此结束。不要往下看了。

1创建一个队列,初始化是t1,t2的根节点加入队列
2 判断队列是否为空 2个一起出队
3 只有2棵树左孩子或者右孩子都不为空才入队 ,这样是为了保证每次可以出对是2个
4 因为我们是对t1数据修改 所以当前t1的左孩子或者右孩子为空 就把t2相对不为空的孩子嫁接过来

  1. package main
  2. import "fmt"
  3. type TreeNode struct {
  4. Val int
  5. Left *TreeNode
  6. Right *TreeNode
  7. }
  8. func mergeTrees1(t1 *TreeNode, t2 *TreeNode) *TreeNode {
  9. if t1 == nil {
  10. return t2
  11. }
  12. if t2 == nil {
  13. return t1
  14. }
  15. t1.Val = t1.Val + t2.Val
  16. t1.Left = mergeTrees1(t1.Left, t2.Left)
  17. t1.Right = mergeTrees1(t1.Right, t2.Right)
  18. return t1
  19. }
  20. func mergeTrees(t1 *TreeNode, t2 *TreeNode) *TreeNode {
  21. if t1 == nil {
  22. return t2
  23. }
  24. if t2 == nil {
  25. return t1
  26. }
  27. queue := []*TreeNode{t1, t2}
  28. for len(queue) > 0 {
  29. n1 := queue[0]
  30. n2 := queue[1]
  31. n1.Val = n1.Val + n2.Val
  32. if n1.Left != nil && n2.Left != nil {
  33. queue = append(queue, n1.Left, n2.Left)
  34. } else if n1.Left == nil && n2.Left != nil {
  35. n1.Left = n2.Left
  36. }
  37. if n1.Right != nil && n2.Right != nil {
  38. queue = append(queue, n1.Right, n2.Right)
  39. } else if n1.Right == nil && n2.Right != nil {
  40. n1.Right = n2.Right
  41. }
  42. queue = queue[2:]
  43. }
  44. return t1
  45. }
  46. func main() {
  47. t1 := &TreeNode{Val: 1}
  48. t11 := &TreeNode{Val: 3}
  49. t1.Left = t11
  50. t12 := &TreeNode{Val: 2}
  51. t1.Right = t12
  52. t13 := &TreeNode{Val: 5}
  53. t11.Left = t13
  54. t2 := &TreeNode{Val: 2}
  55. t21 := &TreeNode{Val: 1}
  56. t2.Left = t21
  57. t22 := &TreeNode{Val: 3}
  58. t2.Right = t22
  59. t23 := &TreeNode{Val: 4}
  60. t21.Right = t23
  61. t24 := &TreeNode{Val: 7}
  62. t22.Right = t24
  63. printNode(mergeTrees(t1, t2)) //3 4 5 4 5 7
  64. fmt.Println()
  65. t3 := &TreeNode{Val: 1}
  66. t31 := &TreeNode{Val: 2}
  67. t3.Left = t31
  68. t32 := &TreeNode{Val: 3}
  69. t31.Left = t32
  70. t4 := &TreeNode{Val: 1}
  71. t41 := &TreeNode{Val: 2}
  72. t4.Right = t41
  73. t42 := &TreeNode{Val: 3}
  74. t41.Right = t42
  75. printNode(mergeTrees(t3, t4)) //2 2 3 2 3
  76. }
  77. func printNode(t1 *TreeNode) {
  78. if t1 == nil {
  79. return
  80. }
  81. fmt.Println(t1.Val)
  82. printNode(t1.Left)
  83. printNode(t1.Right)
  84. }

image.png