📑 题目:101. 对称二叉树

🚀 本题 LeetCode 传送门

题目大意

这一题要求判断 2 颗树是否是左右对称的。

解题思路

  • 这道题是几道题的综合题。将根节点的左字数反转二叉树,然后再和根节点的右节点进行比较,是否完全相等。
  • 反转二叉树是第 226 题。判断 2 颗树是否完全相等是第 100 题。

代码

  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. // 解法一 dfs
  16. func isSymmetric(root *TreeNode) bool {
  17. if root == nil {
  18. return true
  19. }
  20. return isMirror(root.Left, root.Right)
  21. }
  22. func isMirror(left *TreeNode, right *TreeNode) bool {
  23. if left == nil && right == nil {
  24. return true
  25. }
  26. if left == nil || right == nil {
  27. return false
  28. }
  29. return (left.Val == right.Val) && isMirror(left.Left, right.Right) && isMirror(left.Right, right.Left)
  30. }
  31. // 解法二
  32. func isSymmetric1(root *TreeNode) bool {
  33. if root == nil {
  34. return true
  35. }
  36. return isSameTree(invertTree(root.Left), root.Right)
  37. }
  38. func isSameTree(p *TreeNode, q *TreeNode) bool {
  39. if p == nil && q == nil {
  40. return true
  41. } else if p != nil && q != nil {
  42. if p.Val != q.Val {
  43. return false
  44. }
  45. return isSameTree(p.Left, q.Left) && isSameTree(p.Right, q.Right)
  46. } else {
  47. return false
  48. }
  49. }
  50. func invertTree(root *TreeNode) *TreeNode {
  51. if root == nil {
  52. return nil
  53. }
  54. invertTree(root.Left)
  55. invertTree(root.Right)
  56. root.Left, root.Right = root.Right, root.Left
  57. return root
  58. }