---
# System prepended metadata

title: 101. Symmetric Tree

---

# 101. Symmetric Tree

## 題目
Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center).

### Example 1:
```
      1
     / \
    2   2
   / \ / \
  3  4 4  3
  
Input: root = [1,2,2,3,4,4,3]
Output: true
```
### Example 2:

```
      1
     / \
    2   2
     \   \
     3    3

Input: root = [1,2,2,null,3,null,3]
Output: false
```

## 解題思維
已知root的情況下，同時把root.left, root.right傳進判斷的function，判斷左節點與右節點是否相同，func中需判斷下面條件：

1.兩個節點若只有一個是null時，則為false
2.兩個節點值必須相同，否則false
3.往下檢查時，將節點的各自對稱的left right帶入func
4.若兩個節點都null時，則代表檢查結束，且因為前面一連串的檢查都沒檢查到false，故判斷成此數對稱，所以return true


### 圖解
![](https://i.imgur.com/O8YUzxB.gif)



### Golang

```go=
func isSymmetric(root *TreeNode) bool {
 return findSymmetric(root.Left, root.Right)
}

func findSymmetric(left *TreeNode, right *TreeNode) bool {
    //只要其中一個為null那就代表一定不是對稱的
    if (left != nil && right == nil) ||  (left == nil && right != nil)  {
    return false
}

    //代表檢查到最後一組了 但是前面都沒處發false 代表前面都是對稱的
    if left == nil && right == nil {
        return true
    }

 //當兩個節點值都相同時才繼續更深層的節點檢查
    if left.Val == right.Val {
      //在此func中 把left與right，當成第二層的2，即可理解此處程式碼意義。
      /* 示意圖：
          1
         / \
        2   2
       / \ / \
      3  4 4  3
      */ //所以此處是              3           3                            4            4
        return findSymmetric(left.Left, right.Right) && findSymmetric(left.Right, right.Left)
    }

    return false
}

```