算法:對稱的二叉樹(LeetCode)

題目:請實現一個函數,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的鏡像一樣,那麼它是對稱的。

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。

1

/ \

2 2

/ \ / \

3 4 4 3

但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的:

1

/ \

2 2

\ \

3 3

示例 1:

輸入:root = [1,2,2,3,4,4,3]

輸出:true

示例 2:

輸入:root = [1,2,2,null,3,null,3]

輸出:false

限制:

0 <= 節點個數 <= 1000

解題思路:將二叉樹每一層都放到數組中獨自判斷,由左向右,為空則放空指針。

<code>/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSymmetric(root *TreeNode) bool {
    if root==nil{
        return true
    }
    tmp:=make([]*TreeNode,1)
    tmp[0]=root//根結點
    for len(tmp)>0{
        l:=len(tmp)
        for i:=0;i/<code>

執行用時 :4 ms, 在所有 Go 提交中擊敗了74.74%的用戶

內存消耗 :3 MB, 在所有 Go 提交中擊敗了100.00%的用戶

優化:使用遞歸,判斷左右子樹是否相等。

<code>/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSymmetric(root *TreeNode) bool {
    if root==nil{
        return true
    }
    return check(root.Left,root.Right)
}
func check(left,right *TreeNode) bool{
    if left==nil && right==nil{
        return true
    }
    if left==nil || right==nil || left.Val!=right.Val{
        return false
    }
//判斷左子樹的右子樹是否和右子樹的左子樹是否相等,判斷左子樹的左子樹和右子樹的右子樹是否相等。達到對稱。
    return check(left.Right,right.Left) && check(left.Left,right.Right)
}/<code>

執行用時 :4 ms, 在所有 Go 提交中擊敗了74.74%的用戶

內存消耗 :2.9 MB, 在所有 Go 提交中擊敗了100.00%的用戶


分享到:


相關文章: