leetcode刷題筆記一百零一題 對稱二叉樹
阿新 • • 發佈:2020-08-03
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 }