《剑指offer》总结二 之二叉树
目录
17、树的子结构(27ms,5836k)
题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:
要查找A中是否存在和树B结构一样的子树,分为以下两步:
1. 第一步:在树A中找到和树B的根结点的值一样的结点R; 2. 第二步:判断树A中以R为根结点的子树是否包含和B一样的结构。
遍历结点下面的子树,直到树B中的所有结点在树A中某个子树中找到。
代码实现:树的子结构
18、二叉树的镜像(38ms)
题目描述:
操作给定的二叉树,将其变换为源二叉树的镜像。
思路:
二叉树的镜像:即根结点和每个中间结点的左右孩子结点交换位置得到的一棵二叉树。
求镜像的过程:先前序遍历这棵树的每个结点,如果遍历的结点有子结点,就交换它的两个子结点。当交换完所有非叶结点的左、右子结点之后,就得到了树的镜像。
前序遍历:根节点->左子树->右子树.
代码实现:二叉树的镜像
24、二叉树中和为某一值的路径(26ms,5728k)
题目描述:
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
思路:
首先用前序遍历的方式访问到某一个结点,我们把该结点添加到路径中,并且累加该结点对应的值。
如果该结点为叶结点,并且路径上结点的值的和刚好等于输入的整数,则当前路径符合要求。
如果该结点不是叶结点,则继续访问它的子结点。
当前结点访问结束后,递归函数将自动回到它的父结点。并且在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是从根结点到父结点。
代码实现:二叉树中和为某一值的路径
38、二叉树的深度(26ms,5624k)
题目描述:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
思路:
如果一个树只有一个根结点,那它的深度为1;如果根结点只有左子树没有右子树,则在它的左子树深度上加1;同样,如果根结点只有右子树没有左子树,则在它的右子树深度上加1;如果根结点既有左子树又有右子树,则该树的深度为左右子树深度的较大值加1.最后将左右子树递归判断其是否右左右子树(即不断计算左右子树的深度)
代码实现:二叉树的深度
58、对称的二叉树(26ms,5704k)
题目描述:
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:
首生成二叉树的镜像,然后判断该二叉树与二叉树的镜像的每个结点是否相等,如果完全相等,则该二叉树为对称的。
将该二叉树与其本身是否对称作判断,首先,判断二叉树中的某个结点的左右孩子结点是否对称(即值是否相等),然后递归判断左结点的右孩子(左孩子)结点与右结点的左孩子(右孩子)结点是否对称。
代码实现:对称的二叉树
参考:
《剑指offer》宝典神功
- ASP.NET MVC Model元数据及其定制: Model元数据的定制
- 小白也可以操作的手机TensorFlow教程:Android版和iOS版
- PhalApi-PHPExcel基于PhalApi的PHPExcel拓展
- [喵咪软件推荐(2)]全球服务器测速工具speedtest-cli
- 使用Keras创建一个卷积神经网络模型,可对手写数字进行识别
- 新生代的垃圾回收:Copy GC之基本原理
- [喵咪软件推荐(1)]全球国家信息库
- 一文教你在Python中打造你自己专属的面部识别系统
- [喵咪Liunx(6)]Nginx日志分析工具goaccess
- 用Atomic实现锁
- [喵咪Liunx(5)集群管理利器pssh
- synchronized关键字的语义
- [喵咪KafKa(3)]PHP拓展See-KafKa
- [喵咪KafKa(2)]单机模式运行KafKa
- 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 数组属性和方法
- 唐朝人更懂React
- 一起学习PHP的runkit扩展如何使用
- CentOS7下部署开源网络流量回溯分析系统Moloch
- spring源码(八)
- 通过源码理解rarp协议(基于linux1.2.13)
- 详解Im2Col+Pack+Sgemm策略更好的优化卷积运算
- Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储
- 聊聊调试的那些事,超实用!!!
- [不定时一题]LeetCode无重复字符的最长子串
- 整理了小程序云开发实战,你看懂了吗?
- Reactive-MongoDB异步Java Driver解读
- 解密Go协程的栈内存管理
- 深入浅出mongodb之实战
- 想成为可视化高手?这篇合集就够了 | Vue
- 谈谈Vue开发过程中用到的插件