2019-11-22  80 views 评论

Leetcode题目解析(191122):101&102&104

 标签:

Leetcode 101:对称二叉树

题目描述

给定一个二叉树,检查它是否是镜像对称的。

解题思路

既然它是镜像的话,那么就是左右对称,这个我们可以使用一个递归来解决。我们令A等于这个树,B也等于这个树,假设A树和B树都只有一个结点(空结点也看做是一个结点)其实也就是两个树中至少一个树为NULL的时候,结果只会存在三种情况:
1.A的该结点为NULL,B的该结点也为NULL,即都是空结点,那么这两个树相等,自然是镜像,返回true;
2.A的该结点为NULL,B的该结点不为NULL(或者A的该结点不是NULL,B的该结点为NULL),那么不是镜像,返回false;
3.A和B均有值,但不相等,自然不是镜像,返回false。
我们把这个结点看做是其父结点的一个子树,然后逐层向上去扩展。
判断的时候是由上向下,只要两个结点值相等就继续递归。

代码实现

时间复杂度&空间复杂度

运行时间

Leetcode 102:二叉树的层序遍历

题目描述

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

解题思路

这其实就是二叉树的BFS,但是和之前又有一点不同,那就是保存的结果不是一个vector,而是一个vector类型的vector数组,数组里面有多个vector,每个vector里面的元素是这一层的值。所以关键在于如何存储呢?那这个就可以借鉴之前做过的二叉树的右视角这个题,我们储存一个size,代表这一层有多少个元素,然后执行一个for循环,在这个for循环里面把元素push到一个tmp数组中,for循环完成后,把tmppush到result即可。

但是不知道为什么,那个for循环如果我用while循环的话,就会超时,需要研究一下。

代码实现

执行用时和内存消耗

运行时间

Leetcode 104:二叉树的最大深度

题目描述

给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。

示例

给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度为3。

题目解析:递归法

如果一棵树只有一个结点,那么深度为1.如果根节点只有左子树而没有右子树,那么深度就是左子树深度+1;同理,对于右子树也是如此。如果既有左子树,也有右子树,那么该树的深度就是左右子树深度的最大值+1。所以可以利用递归的方式实现该题目。

代码实现:递归法

题目解析:广度优先

借鉴层序遍历的方法,只不过使用了deque,不具体说思路了,比较简单。

代码实现:广度优先

时间复杂度&空间复杂度

递归法:

运行时间

广度优先:

运行时间

可以看出,广度优先算法提升了速度,减小了内存消耗。

给我留言

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: