1. 程式人生 > 實用技巧 >leetcode刷題筆記一百零一題 對稱二叉樹

leetcode刷題筆記一百零一題 對稱二叉樹

leetcode刷題筆記一百零一題 對稱二叉樹

源地址:101. 對稱二叉樹

問題描述:

給定一個二叉樹,檢查它是否是映象對稱的。

例如,二叉樹 [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.p與q根結點值相等
2.p的左子樹與q右子樹相同,p的右子樹與q的左子樹如同
*/

//遞迴
/**
 * Definition for a binary tree node.
 * class TreeNode(var _value: Int) {
 *   var value: Int = _value
 *   var left: TreeNode = null
 *   var right: TreeNode = null
 * }
 */
object Solution {
    def isSymmetric(root: TreeNode): Boolean = {
        def rec(leftTree: TreeNode, rightTree: TreeNode): Boolean = {
            if (leftTree == null && rightTree == null) return true
            if (leftTree == null || rightTree == null) return false
            if (leftTree.value == rightTree.value) return(rec(leftTree.left, rightTree.right) && rec(leftTree.right, rightTree.left))
            return false
        }
        return rec(root, root)
    }
}

//迭代,這種情況需要使用佇列
/**
 * Definition for a binary tree node.
 * class TreeNode(var _value: Int) {
 *   var value: Int = _value
 *   var left: TreeNode = null
 *   var right: TreeNode = null
 * }
 */
import scala.collection.mutable.Queue
import util.control.Breaks._ 
object Solution {
    def isSymmetric(root: TreeNode): Boolean = {
        val queue = new Queue[TreeNode]()
        queue.enqueue(root)
        queue.enqueue(root)
        while (queue.isEmpty == false){
            breakable{
                val left = queue.dequeue
                val right = queue.dequeue
                if (left == null && right == null) break()
                if (left == null || right == null) return false
                if (left.value != right.value) return false
                queue.enqueue(left.left)
                queue.enqueue(right.right)
                queue.enqueue(left.right)
                queue.enqueue(right.left)
            }
        }
        return true
    }