「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。
题目
给你一个二叉树的根节点 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
思路
乍一看无从下手,但用递归其实很好解决。
根据题目的描述,镜像对称,就是左右两边相等,也就是左子树和右子树是相当的。
注意这句话,左子树和右子相等,也就是说要递归的比较左子树和右子树。
我们将根节点的左子树记做 left,右子树记做 right。比较 left 是否等于 right,不等的话直接返回就可以了。
如果相当,比较 left 的左节点和 right 的右节点,再比较 left 的右节点和 right 的左节点
比如看下面这两个子树(他们分别是根节点的左子树和右子树),能观察到这么一个规律:
左子树 22 的左孩子 == 右子树 22 的右孩子
左子树 22 的右孩子 == 右子树 22 的左孩子
根据上面信息可以总结出递归函数的两个条件: 终止条件:
left 和 right 不等,或者 left 和 right 都为空 递归的比较 left,left 和 right.right,递归比较 left,right 和 right.left
代码
/**
* 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) {
if(!root) return true
function compare(left,right){
if(!left && !right) return true
if(!left || !right) return false
if(left.val !== right.val) return false
return compare(left.left,right.right) && compare(left.right,right.left)
}
return compare(root.left,root.right)
};
算法的时间复杂度是 O(n)O(n),因为要遍历 nn 个节点 空间复杂度是 O(n)O(n),空间复杂度是递归的深度,也就是跟树高度有关,最坏情况下树变成一个链表结构,高度是nn。