【二叉树】对称二叉树

0x00 题目

给定一个二叉树,检查它是否是镜像对称的。


0x01 思路

对于二叉树的操作,一般都涉及到 遍历
遍历 的方式无非 2 种:
深度 优先:一般使用 递归 算法
广度 优先:一般使用 迭代 算法

判断是否是镜像,就要判断 左右 节点,以及节点的


0x02 解法

语言:Swift

树节点:TreeNode

public class TreeNode {
    public var val: Int
    public var left: TreeNode?
    public var right: TreeNode?
    public init() { self.val = 0; self.left = nil; self.right = nil; }
    public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
    public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
        self.val = val
        self.left = left
        self.right = right
    }
}

递归方式:

当两个节点同时时,返回 true
当两个节点其中一个时,返回 false
两个节点相等时,递归 判断子节点

func isSymmetric(_ root: TreeNode?) -> Bool {
    func isMirror(_ left: TreeNode?, _ right: TreeNode?) -> Bool {
    	// 同时为空
        if left == nil && right == nil { return true }
        
        // 一个为空
        if left == nil || right == nil { return false }
        
        // 相等了,走下一层
        return (left?.val == right?.val) && isMirror(left?.left, right?.right) && isMirror(left?.right, right?.left)
    }
    
    return isMirror(root?.left, root?.right)
}

迭代方式:
操作方式是 一层一层 判断是否镜像对称

func isSymmetric_(_ root: TreeNode?) -> Bool {
    func isMirror(_ left: TreeNode?, _ right: TreeNode?) -> Bool {
        var queue: [TreeNode?] = []
        queue.append(left)
        queue.append(right)
        
        while !queue.isEmpty {
            let node1 = queue.removeFirst()
            let node2 = queue.removeFirst()
            
            if node1 == nil && node2 == nil {
                continue // 进行后面节点的判断
            }
            
            if node1 == nil || node2 == nil {
                return false // 有一个为空
            }
            
            if node1!.val != node2!.val {
                return false // 值不相等
            }
            
            // 注意添加顺序 
            queue.append(node1?.left)   // 左
            queue.append(node2?.right)  // 右
            queue.append(node1?.right)  // 右
            queue.append(node2?.left)   // 左
        }
        return true
    }

    return isMirror(root?.left, root?.right)
}

小笔记XNote

笔记从未如此方便~
请添加图片描述


Guess you like

Origin blog.csdn.net/xjh093/article/details/120194483