对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:组合中存在。
努力,向上,自律