image.png

    1. package main
    2. import "fmt"
    3. type TreeNode struct {
    4. Val int
    5. Left *TreeNode
    6. Right *TreeNode
    7. }
    8. func isSymmetric(root *TreeNode) bool {
    9. return isMirror(root.Left,root.Right)
    10. }
    11. func isMirror(t1 *TreeNode,t2 *TreeNode) bool{
    12. if t1==nil&&t2==nil {
    13. return true
    14. }
    15. if t1==nil||t2==nil{
    16. return false
    17. }
    18. return (t1.Val == t2.Val)&&isMirror(t1.Left,t2.Right)&&isMirror(t1.Right,t2.Left)
    19. }
    20. func isSymmetric1(root *TreeNode) bool {
    21. if root == nil {
    22. return true // []认为是true
    23. }
    24. queue := make([]*TreeNode,0)
    25. queue = append(queue,root.Left)
    26. queue = append(queue,root.Right)
    27. for len(queue)>=2{
    28. left := queue[0]
    29. right := queue[1]
    30. queue = queue[2:]//出栈操作
    31. if left==nil&&right==nil {
    32. continue
    33. }
    34. if left==nil||right==nil{
    35. return false
    36. }
    37. if left.Val != right.Val {
    38. return false
    39. }
    40. queue = append(queue,left.Left)
    41. queue = append(queue,right.Right)
    42. queue = append(queue,left.Right)
    43. queue = append(queue,right.Left)
    44. }
    45. return true
    46. }
    47. func main() {
    48. a := &TreeNode{
    49. Val: 1,
    50. }
    51. b := &TreeNode{
    52. Val: 2,
    53. }
    54. a.Left = b
    55. c := &TreeNode{
    56. Val: 2,
    57. }
    58. a.Right = c
    59. d := &TreeNode{
    60. Val: 3,
    61. }
    62. b.Left = d
    63. e := &TreeNode{
    64. Val: 4,
    65. }
    66. b.Right = e
    67. f := &TreeNode{
    68. Val: 4,
    69. }
    70. c.Left = f
    71. g := &TreeNode{
    72. Val: 3,
    73. }
    74. c.Right = g
    75. // 4,2,5,1,6,3
    76. fmt.Println(isSymmetric1(a))
    77. }
    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode(int x) { val = x; }
    8. * }
    9. */
    10. class Solution {
    11. public boolean isSymmetric(TreeNode root) {
    12. if (root == null) {
    13. return true;
    14. }
    15. // 递归调用判断左右子树
    16. return isSameTree(root.left, root.right);
    17. }
    18. private boolean isSameTree(TreeNode p, TreeNode q) {
    19. if (p == null && q == null) {
    20. return true;
    21. }
    22. if (p == null || q == null) {
    23. return false;
    24. }
    25. if (p.val != q.val) {
    26. return false;
    27. }
    28. // 判断左右子树的左边是否等于右边
    29. return isSameTree(p.left, q.right) && isSameTree(p.right, q.left);
    30. }
    31. }