粥里有勺糖

vuePress-theme-reco 粥里有勺糖    2018 - 2023
粥里有勺糖 粥里有勺糖

Choose mode

  • dark
  • auto
  • light
关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
author-avatar

粥里有勺糖

285

文章

40

标签

关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
  • Algorithm

    • 算法与数据结构
    • 链表--转置
    • 二叉树--层序遍历
    • 二叉树--判断是否对称
    • 排序--快速排序
    • 排序--堆排序
    • 排序--归并排序
    • 字符串--大数相加
    • 字符串--最长公共子序列长度
    • 字符串--最长公共子串
    • 简单--斐波拉契数列1
    • 简单--斐波拉契数列2

判断是否为对称二叉树

vuePress-theme-reco 粥里有勺糖    2018 - 2023

判断是否为对称二叉树

粥里有勺糖 2020-08-02 手撕代码算法与数据结构

# 判断是否为对称二叉树

leetcode:剑指offer:对称二叉树题链

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的

TreeNode

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
1
2
3
4
5
6
7

# 递归解法

  • 简洁明了,美丽大方
  • true
    • 都为null
    • 值相等
  • false
    • 一方为null,另一方不为null
    • 值不相等
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isSymmetric = function (root) {
    if (root === null) {
        return true
    }

    const judge = (r1, r2) => {
        if (r1 === r2 && r2 === null) {
            return true
        }
        if (r1 === null || r2 === null) {
            return false
        }
        return r1.val === r2.val && judge(r1.left, r2.right) && judge(r1.right, r2.left)
    }

    return judge(root.left, root.right)
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 中序遍历解法

如果是对称的,则中序遍历结果数组一定是对称的

中序遍历规则:左根右

上图是一种特殊情况:其中序遍历结果[2,2,1,2,2]但不对称,此时需要对比节点所在层数,[3,2,1,3,2],所以得出下面的代码

var isSymmetric = function (root) {
    if (root === null) {
        return true
    }
    const res = [] // 中序遍历结果
    const level = [] // 存放每个值所在的层数
    const midTravsere = (root, deep) => {
        if (!root) {
            return
        }
        midTravsere(root.left, deep + 1)
        res.push(root.val)
        level.push(deep)
        midTravsere(root.right, deep + 1)
    }
    midTravsere(root, 1)

    // 左右镜像节点进行对比,如果值不一样或者值一样层数不一样都为false
    for (let i = 0, j = res.length - 1; i < j; i++ , j--) {
        if (res[i] !== res[j] || level[i] !== level[j]) {
            return false
        }
    }
    return true
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 层序遍历

...未完待续

Edit this page (opens new window)
Last Updated: 2022/5/15 12:46:34