LeetCode101、对称二叉树

17 阅读2分钟

LeetCode 系列记录我学习算法的过程。

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

题目

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例:

image.png

输入: root = [1,2,2,3,4,4,3]
输出: true

image.png

输入: root = [1,2,2,null,3,null,3]
输出: false

提示

  • 树中节点数目在范围 [1, 1000] 内
  • -100 <= Node.val <= 100

思路

这个题目和相同二叉树有点类似,所以可以借鉴之前的方法

既然是对称二叉树,那肯定是对根节点的左右子树进行遍历来对比

但是和判断相同二叉树的遍历又有些不同,以为这个是对称二叉树,所以我们在遍历的时候,两棵树的顺序是要相反的:

  • 首先定义一个递归函数接收两个二叉树,判断两棵树是否对称
  • 首先判断两棵树都为 null,则返回 true
  • 然后判断其中一个二叉树为空,另一颗不为空则返回 false
  • 然后对当前节点值进行判断,不相同则返回 false
  • 最后在递归两树的左子树和右子树
  • 调用递归函数,将根节点的左右子树传入,返回函数结果即可

代码实现

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isSymmetric = function(root) {

    // 判断两颗树是否对称
    function isSameTree(p, q) {
        // 两树均 null 返回 true
        if (!p && !q) return true
        // 只有一树 null 返回 false
        if (!p || !q) return false
        // 节点值不同 返回 false
        if (p.val !== q.val) return false
        // 最后返回递归 左右子树 的值
        return isSameTree(p.left, q.right) && isSameTree(p.right, q.left)
    };

    return isSameTree(root.left, root.right)

};

image.png

优化

还可以使用迭代的方式来解决

var isSymmetric = function(root) {
    // 定义一个迭代函数
    function check (p, q) {
        // 定义一个栈
        const task = []
        // 将传入的树存入栈
        task.push(p),task.push(q)
        // 遍历栈
        while (task.length) {
            // 取出栈的后两位
            u = task.shift()
            v = task.shift()
            
            // 判断
            if (!u && !v) continue
            if ((!u || !v) || (u.val !== v.val)) return false
            
            // 分别存入两树的左右子树
            task.push(u.left)
            task.push(v.right)

            task.push(u.right)
            task.push(v.left)
        }
        // 遍历结束返回true
        return true
    }
    // 调用迭代函数返回结果
    return check(root.left, root.right)

};

image.png