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);
}