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
    }
posted @ 2020-08-03 17:37  ganshuoos  阅读(80)  评论(0编辑  收藏  举报