Loading

对Java对象一点新的理解(记录错误)

 

时间:2022/11/17

 

在做leetcode450:删除二叉搜索树中的节点时我写了如下代码:

 1 if(root.left != null && root.right != null){
 2     TreeNode temp = root.right;
 3 
 4     while(temp.left != null){
 5         temp = temp.left;
 6     }
 7 
 8     temp.left = root.left;
 9     root = root.right;
10 }else if(root.left != null && root.right == null){
11     root = root.left;
12 }else if(root.left == null && root.right != null){
13     root = root.right;
14 }else{
15     root = null;
16 }

其中root是遍历找到的要删除的节点,当输入值root=[5,3,6,2,4,null,7]时,最终得到的结果是root=[5,3,6,2,4,null,7,null,null,2],而不是正确的结果root=[5,4,6,2,null,nul,7],这说明上面的第9行,root=root.right并没有生效,即并没有改变二叉搜索树的结构,那为什么会这样呢?

根据之前对Java运行时数据区域的讲解,我们可以知道:局部变量是存储在虚拟机栈中的,而对象存放在堆中,所以这里的局部变量root就类似于C/C++中的指针,上面代码中的root=root.right只是改变了root的指向,并没有改变堆中对象的内容,所以二叉搜索树的结构并没有被改变。

在树中,不能通过直接让节点=的方式来改变树的结构,需要通过left和right=来改变树的结构。

相同的问题也在leetcode77:组合中存在。

 

posted @ 2022-11-17 11:11    阅读(24)  评论(0编辑  收藏  举报