【算法专栏】对称的二叉树
时间:2022-06-21
本文章向大家介绍【算法专栏】对称的二叉树,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本系列是《剑指offer》或leetcode的JavaScript版本。 每期1-2个算法,也有可能是一个类别。 文章包括题目、思路以及代码。 如果您对本期有不同或者更好的见解,请后台留言,喜欢请点个好看,谢谢阅读。
题目1-对称的二叉树
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路
二叉树的右子树是二叉树左子树的镜像二叉树。
镜像二叉树:两颗二叉树根结点相同,但他们的左右两个子节点交换了位置。
如图,1为对称二叉树,2、3都不是。
- 两个根结点相等
- 左子树的右节点和右子树的左节点相同。
- 右子树的左节点和左子树的右节点相同。
递归所有节点满足以上条件即二叉树对称。
代码
function isSymmetrical(pRoot) { return isSymmetricalTree(pRoot, pRoot); }
function isSymmetricalTree(node1, node2) { if (!node1 && !node2) { return true; } if (!node1 || !node2) { return false; } if (node1.val != node2.val) { return false; } return isSymmetricalTree(node1.left, node2.right) && isSymmetricalTree(node1.right, node2.left); }
题目2-序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树
思路
- 若一颗二叉树是不完全的,我们至少需要两个遍历才能将它重建(像题目重建二叉树一样)
- 但是这种方式仍然有一定的局限性,比如二叉树中不能出现重复节点。
- 如果二叉树是一颗完全二叉树,我们只需要知道前序遍历即可将它重建。
- 因此在序列化时二叉树时,可以将空节点使用特殊符号存储起来,这样就可以模拟一棵完全二叉树的前序遍历
- 在重建二叉树时,当遇到特殊符号当空节点进行处理
代码
function Serialize(pRoot, arr = []) { if (!pRoot) { arr.push('#'); } else { arr.push(pRoot.val); Serialize(pRoot.left, arr) Serialize(pRoot.right, arr) } return arr.join(','); }
function Deserialize(s) { if (!s) { return null; } return deserialize(s.split(',')); }
function deserialize(arr) { let node = null; const current = arr.shift(); if (current !== '#') { node = { val: current } node.left = deserialize(arr); node.right = deserialize(arr); } return node; }
- 腾讯云GAME-TECH沙龙——全球同服游戏语音解决方案
- 【Scikit-Learn 中文文档】双聚类 - 无监督学习 - 用户指南 | ApacheCN
- ASP.NET MVC的客户端验证:jQuery的验证
- RxJava系列一
- ASP.NET MVC涉及到的5个同步与异步,你是否傻傻分不清楚?[上篇]
- 被遗忘的软件产品形态
- 区块链是什么,一文给您讲清楚
- ASP.NET MVC涉及到的5个同步与异步,你是否傻傻分不清楚?[下篇]
- 2017科技颠覆生活哪家强?
- 柯洁宣布复出,再次迎战AI!但对手不再是阿尔法狗……
- 【Scikit-Learn 中文文档】协方差估计 / 经验协方差 / 收敛协方差 / 稀疏逆协方差 / Robust 协方差估计 - 无监督学习 - 用户指南 | ApacheCN
- 先搞懂这八大基础概念,再谈机器学习入门!
- 人工智能化的传感器技术
- 带有CSS3的动画3D条形图
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 解决SSH登录缓慢
- Html ul、li Css标签详解 使用图片自定义样式 隐藏小点样式齐全
- TRTC Android端开发接入学习之实现视频通话(五)
- 让WordPress默认用户无法进入后台
- 图像处理笔记(2)----OpenCV imread函数详解
- 面试官:来写个代码求一下两个数的最大公约数吧
- 聊聊BitCaskLock
- 自动化构建工具~Maven
- 聊聊BitCaskKeyDir
- 使用 Node.js 定制你的技术雷达:上篇
- css画div对角线
- redis学习笔记--redis过期机制学习
- 猿实战08——属性库实现之属性关系绑定
- 猿实战07——属性库之实现电商系统基石模块
- 栈与队列简介