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

Java二进制InOrder树遍历--为什么在函数外部初始化ArrayList会有不同?

Java二进制InOrder树遍历是一种遍历二叉树的方法,按照中序遍历的顺序访问树的节点。在函数外部初始化ArrayList会导致不同的结果,这是因为Java中的引用类型在函数传递时是按值传递的。

当在函数外部初始化ArrayList时,实际上是在堆内存中创建了一个ArrayList对象,并将其引用赋值给了一个变量。当这个变量作为参数传递给函数时,函数内部的操作会修改这个ArrayList对象的内容。

然而,当在函数内部重新初始化一个ArrayList对象时,实际上是在栈内存中创建了一个新的ArrayList对象,并将其引用赋值给了函数内部的变量。此时,函数内部的操作只会修改这个新的ArrayList对象,不会影响函数外部的ArrayList对象。

因此,如果在函数外部初始化ArrayList,并将其作为参数传递给函数,在函数内部对ArrayList进行修改后,函数外部的ArrayList对象也会被修改。而如果在函数内部重新初始化ArrayList,函数内部的修改只会影响到函数内部的ArrayList对象,不会影响函数外部的ArrayList对象。

推荐的腾讯云相关产品:腾讯云云服务器(ECS)和腾讯云数据库(TencentDB)。

腾讯云云服务器(ECS)是一种弹性计算服务,提供可调整的计算能力,适用于各种应用场景。您可以根据实际需求选择不同配置的云服务器,支持多种操作系统和应用程序。

腾讯云数据库(TencentDB)是一种高性能、可扩展的云数据库服务,支持多种数据库引擎,包括MySQL、SQL Server、MongoDB等。您可以根据业务需求选择适合的数据库引擎和配置,实现数据存储和管理。

更多关于腾讯云云服务器和腾讯云数据库的详细信息,请访问以下链接:

腾讯云云服务器(ECS):https://cloud.tencent.com/product/cvm 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【算法】二叉遍历算法总结:前序中序后序遍历

前言 二叉遍历是非常经典的算法题,也是二叉的一道基础算法题。 但是平常的笔试面试中,其出现的频率其实并不是特别的高,我推测是这种题目相对来说比较基础,算是一个基础知识点。...递归方法下,前中后序遍历都是一个思路,理解起来也比较容易。 但是只是用迭代的话,二叉遍历其实是有难度的!...,这也是为什么LeetCode会在这三题题目的下方写出进阶: 递归算法很简单,你可以通过迭代算法完成吗?这句话了。...注2:本文中的代码会尽量简单,易懂,并不会去追求极致的写法(比如:一行内完成,使用各种非正式的库等)。 正文 二叉的定义 最多有两棵子树的被称为二叉 ?...比如前序遍历递归的函数里,先往结果数组里加入根节点,然后加入根节点的左节点,然后加入根节点的右节点。最后所有递归的函数运行完毕,结果集就已经完成了。 中序和后序的思路相同,就不再赘述了。

1.7K20

【算法】二叉遍历算法总结:前序中序后序遍历

前言 二叉遍历是非常经典的算法题,也是二叉的一道基础算法题。 但是平常的笔试面试中,其出现的频率其实并不是特别的高,我推测是这种题目相对来说比较基础,算是一个基础知识点。...递归方法下,前中后序遍历都是一个思路,理解起来也比较容易。 但是只是用迭代的话,二叉遍历其实是有难度的!...,这也是为什么LeetCode会在这三题题目的下方写出进阶: 递归算法很简单,你可以通过迭代算法完成吗?这句话了。...比如前序遍历递归的函数里,先往结果数组里加入根节点,然后加入根节点的左节点,然后加入根节点的右节点。最后所有递归的函数运行完毕,结果集就已经完成了。 中序和后序的思路相同,就不再赘述了。...听不懂没关系,下面使用中序遍历作为例子来理解莫里斯遍历到底是什么意思,例子来自LeetCode官方题解: 中序遍历 Step 1: 将当前节点current初始化为根节点 Step 2: While current

1K40

二叉的递归遍历,套路都在这里

二叉的递归遍历 这次我们要好好谈一谈递归,为什么很多同学看递归算法都是“一看就会,一写就废”。 主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都靠运气。...好了,我们确认了递归的三要素,接下来就来练练手: 以下以前序遍历为例: 确定递归函数的参数和返回值:因为要打印出前序遍历节点的数值,所以参数里需要传入vector放节点的数值,除了这一点就不需要在处理什么数据了也不需要有返回值...,所以递归函数返回类型就是void,代码如下: void traversal(TreeNode* cur, vector& vec) 确定终止条件:递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了...其他语言版本 Java: // 前序遍历·递归·LC144_二叉的前序遍历 class Solution { ArrayList preOrderReverse(TreeNode...List res = new ArrayList(); inorder(root, res); return res; } void

42720

Python3、Java 实现「783. 二叉搜索树节点最小距离」

题目描述 给你一个二叉搜索的根节点 root,返回 中任意两不同节点值之间的最小差值。 示例 1: ? 输入:root = [4, 2, 6, 1, 3] 输出:1 示例 2: ?...输入:root = [1, 0, 48, null, null, 12, 49] 输出:1 提示: 中节点数目范围 [2, 100] 内 解题思路 这道题主要是考察二叉搜索的性质,二叉搜索的中序遍历得到的结果是升序排列的...要得到中任意两个不同节点值之间的最小差值,那么只需要比较中序遍历得到的序列的相邻元素,求得最小值就可以了。...这道题看上去有点无从下手的感觉,但是碰到二叉搜索,就一定要想到的中序遍历是有序的,这几乎是碰到二叉搜索的必考点。...; import java.util.ArrayList; class Solution { private List list; public int minDiffInBST

41920

二叉题目合集

方法一 : 最原始的方法, 用迭代法或者递归的方法将二叉遍历完,得出节点的数量 方法二 : 只针对完全二叉的解法 完全二叉中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中该层最左边的若干位置...对于情况一,可以直接用 2^深度 - 1 来计算,注意这里根节点深度为1。 对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉,然后依然可以按照情况1来 计算。...给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉的中序遍历, postorder 是同一棵的后序遍历,请你构造并返回这颗 二叉 。...; } int rootIndex = map.get(postorder[postEnd - 1]); // 找到后序遍历的最后一个元素中序遍历中的位置...return null; } int rootIndex = map.get(postorder[postEnd - 1]); // 找到后序遍历的最后一个元素中序遍历中的位置

5210

【小Y学算法】⚡️每日LeetCode打卡⚡️——25.二叉的中序遍历

右子树的方式遍历这棵,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵。...因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。...方法一:递归 思路解析 首先我们需要了解什么是二叉的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵。...因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。...:双指针 思路解析 方法一的递归函数我们也可以用迭代的方式实现,两种方式是等价的,区别在于递归的时候隐式地维护了一个栈,而我们迭代的时候需要显式地将这个栈模拟出来,其他都相同,具体实现可以看下面的代码

18820

来来来,我们聊一聊,为什么不建议使用递归操作?

但我们听到这句话的时候,是否会产生过疑问,为什么不建议使用递归操作呢? 现在,我们就一起聊聊这个话题,看看递归到底会产生什么样的问题。 首先,我们思考一道算法题:如何实现二叉的中序遍历?...对于遍历,无论是前序、中序还是后序遍历,大家可能下意识的就会想到递归,为什么呢?因为递归操作实现起来“简单”啊,而且的结构完美契合了递归的应用场景!...但对于某些问题,如上面我们考虑的二叉的中序遍历条件允许的情况下,我们还是倾向于使用递归实现的,因为相对来说,递归的实现更简单,也更容易理解。...例如,一棵 10 层的二叉,我们调用上述的inorder方法,将level设置为 5,即使用inorder(root, 5)来进行遍历,这意味着我们仅能遍历出这棵 10 层的前 5 层,并没有把这棵完全遍历出来...因此,像我们上面实现的二叉的中序遍历,就很难用尾递归的形式来改写,因为递归形式的中序遍历需要在遍历左右子树之间,把结果存起来,从而给函数最后一行调用函数自身的形式造成了很大的困难。

44620

来来来,我们聊一聊,为什么不建议使用递归操作?

但我们听到这句话的时候,是否会产生过疑问,为什么不建议使用递归操作呢? 现在,我们就一起聊聊这个话题,看看递归到底会产生什么样的问题。 首先,我们思考一道算法题:如何实现二叉的中序遍历?...对于遍历,无论是前序、中序还是后序遍历,大家可能下意识的就会想到递归,为什么呢?因为递归操作实现起来“简单”啊,而且的结构完美契合了递归的应用场景!...但对于某些问题,如上面我们考虑的二叉的中序遍历条件允许的情况下,我们还是倾向于使用递归实现的,因为相对来说,递归的实现更简单,也更容易理解。...例如,一棵 10 层的二叉,我们调用上述的inorder方法,将level设置为 5,即使用inorder(root, 5)来进行遍历,这意味着我们仅能遍历出这棵 10 层的前 5 层,并没有把这棵完全遍历出来...因此,像我们上面实现的二叉的中序遍历,就很难用尾递归的形式来改写,因为递归形式的中序遍历需要在遍历左右子树之间,把结果存起来,从而给函数最后一行调用函数自身的形式造成了很大的困难。

86000

二叉(前序、中序、后序遍历图片步骤详解)

:左子树—> 根结点 —> 右子树(中间遍历根节点) 这棵的中序遍历为:DBGEHACF 代码实现: public List inorderTraversal(TreeNode...root) { List res = new ArrayList(); inorder(root, res);...inorder(root.right, res); } 后序遍历:左子树 —> 右子树 —> 根结点(最后遍历根节点) 这棵的后序遍历为:DGHEBFCA 代码实现: public List...我们看到右子树节点为CF,中序遍历也是CF,那么就可以推断出现在的二叉右边是这个样子: 为什么F不是左子树呢,因为如果F左边,中序遍历的顺序就变成FC了 由前序遍历AB可以知,A的左子树肯定是...B的右子树了 ,最后由中序遍历GEH可知完整的二叉为: 推断出整棵后其他的遍历就都很容易写出来了。

40410

搞定大厂算法面试之leetcode精讲21.

二叉的前序遍历(easy) 94. 二叉的中序遍历 (easy) 145....list.add(root.val); inorder(root.right, list); } } // 后序遍历 class Solution {...二叉的最近公共祖先 (medium) 方法1.递归 ds_44 思路:分四种情况,1.root是null或者root等于p或q,说明root是p,q的公共祖先,2.递归左右子树,如果左右子树递归函数返回的都不为空...,则root就是p,q的公共祖先,3.左子树递归函数返回的值为空,则p,q都在右子树,4.右子树递归函数返回的值为空,则p,q都在左子树 复杂度分析:时间复杂度 : O(n),n是二叉树节点的个,空间复杂度...二叉的层序遍历 (medium) 方法1.广度优先遍历 动画过大,点击查看 思路:准备一个队列,将根节点加入队列,当队列不为空的时候循环队列,每次循环拿到当前队列的大小,循环当前层的每个元素,然后加入输出数组

53650

二叉的前序、中序、后序遍历 非递归解法

数据结构二叉遍历基础,递归解法很早之前的博客就以C语言的形式总结了,这篇博文聚焦非递归解法。...二叉的前序、中序、后序遍历都可以借助栈来实现,因为递归本质也是靠栈来实现的,中序遍历还有一种比较难想的镜像法。 前序遍历 leetcode 144....Binary Tree Preorder Traversal 直接使用栈,入栈顺序先右子树左子树。...Binary Tree Inorder Traversal 维护一个cur指针和栈,cur指针指向当前处理的节点,栈中存将要处理的节点,二者任意为空结束循环。...Binary Tree Postorder Traversal 直接使用栈,入栈顺序先左子树后右子树(跟前序遍历相反,想一想为什么),逆序加入结果集(想一想为什么)。

65940

算法:二叉遍历类题目

算法:二叉遍历类题目 遍历顺序是依赖于 根 节点的位置,前序遍历的顺序为 根左右,中序遍历的顺序为 左根右,后序遍历的顺序为 左右根。除此以外还存在层次遍历。...类算法中,很多题目是基于遍历的性质而产生的,熟悉遍历和性质是灵活应用类题目的前提。 那么什么是和二叉(tree)是n(n>=0)个结点的有穷集。n=0时称为空。...这样弹出时可以按照先序遍历的顺序从左到右进行弹出。 2. 中根遍历 2.1 中根的递归遍历 // 由于方法中要方法结果列表,不可直接进行迭代,可以定义全局列表,或定义helper方法。...自顶向下意味着每一个递归层级,先方法当前节点应用计算一些值。 自底向上意味着先进行递归遍历,利用递归的回溯的原理,递归的回溯过程中应用计算。...如果题目必须遍历到叶子节点后才能计算出中间值,则需要使用自底向上。当然如果是根据叶子节点的值的状态,或者遍历过程中并不需要更新结果值,那么这两种方式其实是很混淆的。

22530

面渣逆袭:Java集合连环三十问

(1)数据结构不同 ArrayList基于数组实现 LinkedList基于双向链表实现 (2) 多数情况下,ArrayList更利于查找,LinkedList更利于增删 ArrayList基于数组实现...(4)内存占用,ArrayList基于数组,是一块连续的内存空间,LinkedList基于链表,内存空间不连续,它们空间占用上都有一些额外的消耗: ArrayList是预先定义好的数组,可能会有空的内存空间...为什么不用二叉/平衡呢?...至于红黑转回链表的阈值为什么是6,而不是8?是因为如果这个阈值也设置成8,假如发生碰撞,节点增减刚好在8附近,会发生链表和红黑的不断转换,导致资源浪费。 20.扩容什么时候呢?...面试官:为什么 HashMap 的加载因子是0.75? [8]. 面试旧敌之红黑(直白介绍深入理解) [9]. Java TreeMap工作原理及实现 [10].

62020

二叉oj以及前中后序非递归写法

,所以可以知道该题肯定得使用中序遍历,其次要求二叉的左指针指向前驱节点,右指针指向后继节点(又因为是要求有序的,所以这个操作是中序遍历中进行的);该题的注意事项是:为了标记前驱节点,我需要一个指针标记...,但是这个函数中针对这个指针的参数必须要是引用,因为递归中传引用可以使得上一层栈帧中的改变被下一层看到;而且因为第一个节点的左值针要指向空,所以前驱节点指针初始化为空是最好的 class Solution...给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉的先序遍历inorder 是同一棵的中序遍历,请构造二叉并返回其根节点 输入: preorder =...()-1); } }; ---- 二叉的前中后序遍历(非递归) 二叉的递归要改成非递归是无法直接更改的,必须要借助外部的结构来更改,这里选用栈,因为栈是后进先出符合需求,还需要一个vector...prev=top这句代码可以标明该根节点是被第二次访问 二叉的前中后序遍历都采用了类似的方法,这也是这里为什么选用这种解决办法的原因,就是省事哈哈。

16730
领券