持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情。
前言
前一段时间因为期末和出去玩之类的事情,刷题停止了一段时间,看着日期上绿色断开心里一阵心痛,终于下点决心继续刷题,回归以前的节奏。
题目
题目十分简单,给你一个二叉树的根节点 root , 检查它是否轴对称。像下面这个就是轴对称
分析
首先要清楚二叉树轴对称的概念,这里的轴对称表示外侧的和外侧对称、里侧和里侧对称。也就是每个子树的左孩子的左孩子与右孩子的右孩子对称,左孩子的右孩子与右孩子的左孩子对称。
- 首先确定函数的参数和返回值
var compareNode = function(left,right)
返回的是子树是否为一个对称二叉树,为布尔值。
- 确定终止条件
节点为空时:
左节点为空,右节点不为空,不对称
左节点不为空,右节点为空,不对称
左右节点均为空,对称
节点不为空时:
比较节点数值,不相同就不对称
- 确定单层递归的逻辑(处理左右节点都不为空,且数值相同的情况)
- 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
- 比较内测是否对称,传入左节点的右孩子,右节点的左孩子。
- 如果左右都对称就返回true ,有一侧不对称就返回false 。
接下来就可以写代码了
代码实现
var isSymmetric = function(root) {
var compareNode = function(left,right){
if(left === null && right !== null || left !== null && right === null) {
return false
} else if(left === null && right === null) {
return true
} else if(left.val !== right.val) {
return false
}
let out = compareNode(left.left,right.right)
let inSide = compareNode(left.right,right.left)
return out && inSide
}
if(root === null) {
return true
}
return compareNode(root.left,root.right)
};
后记
在leetcode上看到一个热门评论,感觉对递归的理解更加深刻了。