0717-7821348
500万彩票网官网电脑版

500万彩票网官网电脑版

您现在的位置: 首页 > 500万彩票网官网电脑版
500万彩票网基本走势图-LeetCode根底算法题第121篇:二叉树的层次遍历 II
2019-05-15 22:04:39

技能进步是一个按部就班的进程,所以我讲的leetcode算法题从最简略的level开端写的,然后> 到中级难度,最后到hard难度悉数完。现在我挑选C言语,Python和Java作为完成言语,由于这三种言语仍是比较典型的。由于篇幅和> 精力有限,其他言语的完成有爱好的朋友请自己测验。初级难度说的差不多的时分,我计划再加点其他内容,我可能会从操作体系到协议栈,从分布式> 聊到大数据结构,从大数据聊到人工智能,... ...。

假如有任何问题能够在文章后谈论或许私信给我。

我会继续共享下去,敬请您的重视。

LeetCode 107. 二叉树的层次遍历 II(Binary Tree Level Order Traversal II)

问题描绘:

给定一个二叉树,回来其节点值自底向上的层次遍历。 (即按从叶子节点地点层到根节点地点的层,逐层从左向右遍历)

示例:

C言语完成:

这道题我实践上做500万彩票网基本走势图-LeetCode根底算法题第121篇:二叉树的层次遍历 II两个完成。

榜首种完成:

  1. 先求出二叉树的深度,求出深度,咱们能够知道成果要回来的二维数组res的长度,咱们能够预先分配;
  2. 再次遍历二叉树,填充res即可。这种办法完成起来比较简略,可是需求对二叉树遍历两次。

详细代码如下:

求二叉树深度的函数getDepth(),咱们在前面现已讲过这500万彩票网基本走势图-LeetCode根底算法题第121篇:二叉树的层次遍历 II个完成。(请参阅"第38日")

函数func()是用来填充res和columnSizes。

这个时分咱们仍然是无法知道二维数组res中每个数组的长度,所以第26行,咱们需求每次都调用reallocl来一次次的扩展当时的数组。然后再将当时节点的val值填入其间。这个realloc下面会再次说到。

第德布劳内二种完成:

考虑到上面的完成要对二叉树遍历2次,假如二叉树有n个节点,那么一切节点共要处理2n次,realloc共要调用n次。

首要想经过一次遍历完成。可是实践完成起来比较杂乱,中心有许多指针。

详细完成如下:

func函数的原理基本上和榜首种办法的func差不多,可是,这儿参数有很大不同:

p_res保存的是res的地址,p_colsize 保存的是colsize(实践是columnSizes)的地址,之所以这样做是由于,在递归的进程中,会调用realloc扩展数组空间,这样可能会导致本来目标的初始地址发作改动,所以这样做来应对这个问题的。

rescap表明的是res的容量,为500万彩票网基本走势图-LeetCode根底算法题第121篇:二叉树的层次遍历 II了削减realloc的次数,咱们依照一个固定的长度BASE_ALLOC_SIZE来分配res。

ressize是表明当时现已用到的长度。

一旦这两个值持平,就阐明res的容量不够了要再次调用realloc扩展了。关于colsize也是相同的道理。仅仅留意对colsize新扩展的部分要初始化为0,由于里边要保存的是数值。

第27行,关于每一个新的depth,都要分配一个新的数组来寄存节点值,这和榜首种完成是相同的,并且接下来对其扩展也是和榜首种办法相同,即一次次的调用realloc。

别的func得到的数组次序是从根节点到叶子节点的,所以在代码46到54行咱们还有再排序。

可见这个完成很杂乱,咱们之所以要介绍他,是由于:

榜首,下面java和python的完成便是用的这种完成,会简略的多,由于不再触及数组的扩大问题。

第二,想阐明一个和功能有关的问题。上面两种完成在LeetCode的中运转功能差不多。我剖析后,发现形成这个问题的关键是malloc和real500万彩票网基本走势图-LeetCode根底算法题第121篇:二叉树的层次遍历 IIloc的问题,经过我的调查realloc常常会修正原目标的开始地址,这就阐明,在当时运转环境下,内存碎片许多,它会导致malloc/realloc的功能下降,假如了解体系内存办理的话,应该很简单了解。

Java言语完成:

Java 的完成和C言语的第二种完成相似,仅仅咱们用List来动态扩展数组。代码如下:

Python言语完成:

Python 的完成和C言语的第二种完成相似,仅仅咱们用List来动态扩展数组。代码如下: