一起学习LeetCode热题100道(39/100)

39.对称二叉树(学习)

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

示例 1:
在这里插入图片描述
输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:
在这里插入图片描述
输入:root = [1,2,2,null,3,null,3]
输出:false

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

解析:
一、主函数 isSymmetric
主函数 isSymmetric(root) 接收根节点作为参数,并调用 isMirror 函数来检查根节点的左子树和右子树是否镜像对称。
1.如果根节点为空,根据定义(虽然这有点边缘情况),我们可以认为它是镜像对称的(尽管严格来说,空树并不是镜像对称的典型例子,但这里我们接受这个特殊情况)。
2.如果根节点不为空,我们调用 isMirror(root.left, root.right) 来检查整棵树是否轴对称。

二、辅助函数 isMirror
我们定义一个辅助函数 isMirror(node1, node2),它接受两个节点作为参数,并返回一个布尔值,表示这两个节点是否镜像对称。

基本情况处理:
1.如果两个节点都为空(!node1 && !node2),则它们是镜像对称的,因为两个空树总是镜像对称的。
2.如果只有一个节点为空(!node1 || !node2),或者两个节点的值不相等(node1.val !== node2.val),则它们不是镜像对称的。

递归调用:
1.如果上述基本情况都不满足,则我们需要递归地检查 node1 的左子树与 node2 的右子树是否镜像对称(isMirror(node1.left, node2.right))。
2.同时,我们也需要递归地检查 node1 的右子树与 node2 的左子树是否镜像对称(isMirror(node1.right, node2.left))。
3.只有当这两个递归调用都返回 true 时,我们才能确定 node1 和 node2 是镜像对称的。

var isSymmetric = function(root) {
    // 如果根节点为空,则认为是镜像对称的(虽然严格来说,空树并不是镜像对称的典型例子,但这里我们可以接受)  
    if (!root) return true;  
    // 调用辅助函数,检查根节点的左右子树是否镜像对称  
    return isMirror(root.left, root.right);  
}  
  
// 辅助函数,检查两个节点是否镜像对称  
function isMirror(node1, node2) {  
    // 如果两个节点都为空,则它们是镜像对称的  
    if (!node1 && !node2) return true;  
    // 如果只有一个节点为空,或者两个节点的值不相等,则它们不是镜像对称的  
    if (!node1 || !node2 || node1.val !== node2.val) return false;  
    // 递归地检查两个节点的子树是否镜像对称  
    return isMirror(node1.left, node2.right) && isMirror(node1.right, node2.left);  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值