首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

102 二叉树的层序遍历

03 解法二:深度优先遍历 这里我们折腾一下,这题广度就是题目它的意思来的。但偏偏就要用深度写下 ? ?...不同的是广度每次内层循环就完成一层节点的遍历,外层去添加这一层的List,深度的话遍历第一个是第一层的第二个就是第二层了第三个就是第三层的第一个了,因此需要先记下层级 public List<List<...return result; } public void dfs(int level, TreeNode root, List> result) { //容器大小小于层级则添加一个新层级...if(result.size()<level) { result.add(new ArrayList()); } //往对应的层级List添加值...04 总结 还是与之前一样,用来熟悉树的遍历,基本上一个题两大种遍历方式都是可以完成,只不过是适用性不一样。总之多思考多熟练树遍历的操作过程

36730

按之字形顺序打印二叉树

题目链接:[编程题]按之字形顺序打印二叉树 题目简单描述: 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 思路: 层序遍历该二叉树,将每一层的节点放进一个...ArrayList中,同时还要反转第二层、第四层等的ArrayList,这里需用到Collections工具类的reverse()来反转集合。...每一层的处理:把根节点放入队列中。队列不为空时循环。记录当前层的节点数,取出一个节点到该层的列表中,如果该节点有左子节点就添加进队列,如果该节点有右子节点也添加进队列。...代码: public ArrayListArrayList> Print (TreeNode pRoot) { // write code here...ArrayListArrayList> ret = new ArrayList(); if (pRoot == null) { return

9110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    这道Java基础题真的有坑!我求求你,认真思考后再回答。

    3.1 第一层:异常信息解读。 3.2 第二层:抛出异常的条件解读。 3.3 第三层:什么是modCount?它是干啥的?什么时候发生变化?...我带你梳理一下: 【第一层:异常信息解读】中说到: 【第二层:抛出异常的条件解读】中说到: 【第三层:什么是modCount?它是干啥的?什么时候发生变化?】...我们看一下源码注释上面是怎么说的: 相对于ArrayList而言,CopyOnWriteArrayList集合是线程安全的容器。在遍历的时候,由于它操作是数组的"快照","快照"不会发生变化。...这一部分的总结也很简单,上一个对比图就好了,如果看不清楚,你可以点开看大图: ArrayList CopyOnWriteArrayList 1 回答另一个问题 现在面试官经常问的一个问题,你读过源码吗?...这种机制是一种思想,它不仅仅是体现在Java的集合中。在我们常用的rpc框架Dubbo中,在集群容错时也有相关的实现。

    61820

    LeetCode 06Z字形变换&07整数反转

    首先要理解题意,它就是本来给一个字符串,然后要按照Z字形排列等到一个形状,根据这个形状按照从左往右的顺序取值得到一个新的字符串。 ?...因为每次只加一个字符,我们如果按照以下的思路看待这个问题(原字符串弯曲),从每一层看,能不能找到每一层有什么规律呢? ?...在这里插入图片描述 第一层是 0 6 12也就是 0 0+(n-1)2 0+(n-1)3 第二层两个求位置关系,可不可以看成第一层每个位置-1和+1两个位置(越界不考虑)?...第三层和第二层同理,看成第一层的-2和+2不越界的位置。 最后一层单独考虑 这样整个逻辑分析就完成了,可以根据位置添加元素进去再取值。...首先,该方法先存到List[]再取,其实是遍历两次,其实大可不必这样,我们可以在进行计算每一层的同时加入到结果中。

    32720

    二叉树的锯齿形层次遍历

    二叉树的锯齿形层次遍历 给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。...,15,7], 3 / \ 9 20 / \ 15 7 返回锯齿形层次遍历如下: [ [3], [20,9], [15,7] ] 解题 首先这个题是在二叉树的层次遍历的基础上进行的...如果你不懂二叉树的遍历可以看: 我是怎么一步一步调试出来二叉树的遍历(超精彩配图),二叉树遍历再也不用愁了 这个矩形的思路其实就是S形状的 ? 我们可以给每一层都标上一个号。...那我们就从1开始 如果这个层是奇数说明是第一层 如果是偶数说明是第二层 然后层数+1 然后循环执行 当判断是奇数还是偶数的时候执行不同的操作。...如果第二层是会ceng+1,说明切换到了第二层 if(ceng%2!

    36810

    Java初始化List的6种方式

    一、常规方式 这种就是我们平常用的最多最平常的方式了,没什么好说的,后面缺失的泛型类型在 JDK 7 之后就可以不用写具体的类型了,改进后会自动推断类型。...("Python"); System.out.println(languages); 二、Arrays工具类 这种方式添加的是不可变的 List, 即不能添加、删除等操作,需要警惕....(dogs); 还有初始化单个对象的 List 工具类,这种方式也是不可变的,集合内只能有一个元素,用得很少。...,节省空间 List cat = Collections.emptyList("cat"); 四、匿名内部类 这种使用了匿名内部类的方式,可以在创建list的时候指定内部对象,可以让代码变的简洁一点...第一层括弧实际是定义了一个匿名内部类 (Anonymous Inner Class),第二层括弧实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行

    3.9K20

    LeetCode 图解 | 18.四数之和

    题目描述 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?...散列表 从散列表入手,先看看输入数据是怎样的数据,如果是只含字母的字符串,用直接寻址表可以试试的,如果是小数点或负数或范围比较大的数字,用归约化处理可以试试,但俺这里就不想麻烦了,直接用 散列表 吧。...因为四个下标随便两两交换都会产生重复的四元组,可以固定四个下标产生一个唯一性的四元组。...))) return o1.get(i) - o2.get(i); } return 0; } }); // 将nums的两键相加添加到散列表...int j = i + 1; j < nums.length; j++) { int key = nums[i] + nums[j]; // 在这里将结果添加到

    40820

    剑指offer | 面试题30:字符串的排列

    字符串的排列 题目描述 :输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。...重复排列方案与剪枝:当字符串存在重复字符时,排列方案中也存在重复的排列方案。为排除重复方案,需在固定某位字符时,保证“每种字符只在此位固定一次” ,即遇到重复字符时不交换,直接跳过。...: 初始化一个 Set ,用于排除重复的字符;将第 x 位字符与 i ∈ [x, len(c)] 字符分别交换,并进入下层递归; 剪枝: 若 c[i] 在 Set 中,代表其是重复字符,因此 “剪枝”...这时再去确定第二个位置的元素,并且此时第一个位置的元素不会再出现在后面的位置上, 依次类推直到确定所有位置的元素,再往前回溯确定每个位置上其他可能出现的元素。...空间复杂度0(N2) :全排列的递归深度为N,系统累计使用栈空间大小为0(N) ; 递归中辅助Set累计存储的字符数量最多为N +(N- 1)+...+2+1=(N + 1)N/2 ,即占用O(N2)的额外空间

    53520

    跳表

    增加了向前指针的链表叫作跳表。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。...,然后从头结点的当前高度开始,依次找到每一层中不小于当前结点的最后一个,然后将待插入结点插入到其后面,如此直到完成第一层的插入。...(对于高度,例如头结点从下往上一次为第一层, 第二层,第三层,第四层) 首先从头结点的第三层开始,发现其下一个位置是5大于4了,因此知道在第三层,应该插入到头结点后面。...对于第二层首先发现一个结点为3,小于4,继续后移,发现下一个结点为5,因此第二层插入到3后面。 对于第一层,发现3的下一个结点为5,大于4,插入3后面即可。...第四层,当前结点的下一个位置是5,不为3,下移 第三层,当前结点的下一个位置是5,不为3,下移 第二层,当前结点的下一个位置是3,删除其下一个位置,下移 第一层,当前结点的下一个位置为2小于三,右移,当前位置的下一个元素为

    44730

    简易理解设计模式之:组合模式——实现View中的树状结构

    -整体层次结构时 • 从一个整体中能够独立出部分模块或功能的场景 个人理解: 组合模式本质就是树状结构算法的实现,它强调出部分与整体的层次结构,并且叶子节点和树枝节点都必须实现相同的接口。...例如目录结构、文件夹结构、公司组织结构等都是组合模式的一个应用。 例子: 在GUI开发中,有些视图控件可以添加其它子视图(ViewGroup),而有些却不能添加(View)。...,并没有添加和删除子View的方法。...,实现了添加和删除的方法。...总结: 此模式本质就是树状结构,在具有明显的层次结构时使用;组合模式分为安全组合模式和透明组合模式,各有特点按实际开发需求斟酌使用。

    52510

    LeetCode动画 | 18.通过散列表解四数之和

    题目描述 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?...散列表 从散列表入手,先看看输入数据是怎样的数据,如果是只含字母的字符串,用直接寻址表可以试试的,如果是小数点或负数或范围比较大的数字,用归约化处理可以试试,但俺这里就不想麻烦了,直接用散列表吧。...file 因为四个下标随便两两交换都会产生重复的四元组,可以固定四个下标产生一个唯一性的四元组。...))) return o1.get(i) - o2.get(i);             }             return 0;         }     });     // 将nums的两键相加添加到散列表...int j = i + 1; j < nums.length; j++) {             int key = nums[i] + nums[j];             // 在这里将结果添加到

    40320

    个人最短路径算法优化

    只针对个人写的业务最短路径的算法优化 原代码逻辑见文章:回溯算法在项目中的实际应用 - 腾讯云开发者社区-腾讯云 (tencent.com) 当第一次选择开始的客户点为N-0个,不能重复计算......或者可以用多层map去判断,当第一层时为map不包含全部数字,然后向下,当第二层时为map不包含全部数字,直到第[数组长度]层,向上返回,向上返回一层时把当前层已选择的数字从map中去掉,如果向上返回时的数字仍有下层节点则接着遍历...如图 图片 代码示例: function getDistance(int[] nums) ->[[][],[][],[][]]{ result = new ArrayList>(); cur = new ArrayList(); for(int num :nums){ cur.add...List> res, int index);{ //终止条件 if(result.length == n) res.add(new ArrayList

    1K10

    Java集合与数据结构——二叉树02

    ,我们要计算叶子节点的数量,定义一个 leafSize ,当节点符合叶子节点的要求时 leafSize ++....,看成求 二叉树的 左子树的叶子节点 + 右子树的叶子节点 当 root == null 时 返回0 当 root.right == null && root.left == null 时,返回1...root 为第一层,我们求第三层相当于求 root.left 的第二层+ root.right 的第二层 同理可得我们最后求的是 root.left.left 的第一层 + root.left.right...的第一层 + root.right.left 的第一层 + root.right.right 的第一层 我们只需要判断此时 k==1 时的节点 是否为空就可以得到第K层的节点,这同时也体现了递归的思路...时间复杂度太大了,遍历了每一个节点,在遍历节点的同时还要计算这个节点的深度,相当于右遍历了一遍,所以就是时间复杂度为 O(n^2) 时间复杂度太大了,我们换一种思路。

    17910

    Java Collection Framework : List

    (不涉及到list的大小改变的修改),都会影响到彼此; 对于结构性修改: 若发生结构性修改的是返回的子list,那么原list的大小也会发生变化(modCount与expectedModCount同时变化...每个 ArrayList 实例都有一个容量,该容量是指用来存储列表元素的数组的大小,并且它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。...扩充容量的方法ensureCapacity。ArrayList在每次增加元素(可能是1个,也可能是一组)时,都要调用该方法来确保足够的容量。...从中可以看出,当容量不够时,每次增加元素,都要将原来的元素拷贝到一个新的数组中,非常之耗时,也因此建议在事先能确定元素数量的情况下,才使用ArrayList,否则建议使用LinkedList。...Java强烈推荐在复制大量数组元素时用该方法,以取得更高的效率; ArrayList 基于数组实现,可以通过下标索引直接查找到指定位置的元素,因此 查找效率高,但每次插入或删除元素,就要大量地移动元素

    92020

    回溯算法在项目中的实际应用

    为了刷题而刷题,带着需求场景去应用算法是最为直接的学习方式。 在大多数算法中解法排名前三的绝对是暴力法,回溯法(含递归),迭代法(含分治法)。...枚举出商户到客户的全排列,计算出每个路线的距离,这一次与上一次的距离比较,哪个路线最小保留。 疑问点: 有人会问了,咦?你这第一个方法不是已经算出最优路线了吗?为什么还要枚举全部可能去计算?...在地图上我们计算距离为实际空间的直线距离,如果实际线路中可能存在逆行,限行等实际路线冲突,所以有必要枚举全部可能。...> list = new ArrayList; for( i=0;i<nums.length;i++){ list.add(calcDistance(origin...或者可以用多层map去判断,当第一层时为map不包含全部数字,然后向下,当第二层时为map不包含全部数字,直到第[数组长度]层,向上返回,向上返回一层时把当前层已选择的数字从map中去掉,如果向上返回时的数字仍有下层节点则接着遍历

    62830

    单例模式探究

    第一层,可见性。指的是在一个线程中对该变量的修改会马上由工作内存(Work Memory)写回主内存(Main Memory),所以会马上反应在其它线程的读取操作中。...第二层语义是禁止指令重排序优化。由于编译器优化,在实际执行的时候可能与我们编写的顺序不同。编译器只保证程序执行结果与源代码相同,却不保证实际指令的顺序与源代码相同。...从缓存中获取,如果没有,就createService再添加到缓存,方便下次获取 这种单例模式是通过缓存和synchronized来完成的 7.优点: (1)由于单例模式在内存中只有一个实例,减少了内存开支...,特别是一个对象需要频繁的创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。...(3)单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如,可以设计一个单例类,负责所有数据表的映射处理。

    38320
    领券