leetcode101.对称二叉树

105 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

前言

前一段时间因为期末和出去玩之类的事情,刷题停止了一段时间,看着日期上绿色断开心里一阵心痛,终于下点决心继续刷题,回归以前的节奏。

image.png

题目

题目十分简单,给你一个二叉树的根节点 root , 检查它是否轴对称。像下面这个就是轴对称

image.png

分析

首先要清楚二叉树轴对称的概念,这里的轴对称表示外侧的和外侧对称、里侧和里侧对称。也就是每个子树的左孩子的左孩子与右孩子的右孩子对称,左孩子的右孩子与右孩子的左孩子对称。

  1. 首先确定函数的参数和返回值
var compareNode = function(left,right)

返回的是子树是否为一个对称二叉树,为布尔值。

  1. 确定终止条件

节点为空时:

左节点为空,右节点不为空,不对称

左节点不为空,右节点为空,不对称

左右节点均为空,对称

节点不为空时:

比较节点数值,不相同就不对称

  1. 确定单层递归的逻辑(处理左右节点都不为空,且数值相同的情况)
  • 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
  • 比较内测是否对称,传入左节点的右孩子,右节点的左孩子。
  • 如果左右都对称就返回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上看到一个热门评论,感觉对递归的理解更加深刻了。

image.png