我最近一直在研究二叉搜索树及其在java中的实现。但是我的问题与obj更相关。面向编程而不是数据结构。类二叉树的一种方法实现如下:
protected BinaryNode<AnyType> findMin( BinaryNode<AnyType> t )
{
//BinaryNode<AnyType> k= new BinaryNode<AnyType>(x);
if( t != null )
while( t.left != null )
{
t=t.left;
}
return t;
}
现在如果不是“t”我把“root”放回二叉树的最小元素,但最后这个方法不会改变“root”的值吗?实际上我知道它不会改变它,但我不明白为什么。
答案 0 :(得分:2)
树没有任何变化。 t
是您插入方法的任何节点的临时替代。这与你这样做时一样:
int x = 5;
int y = x + 1;
System.out.println(x);
System.out.println(y);
输出仍为:
5
6
答案 1 :(得分:1)
该方法改变堆栈中方法参数的值,该值是引用。所以你改变引用(这意味着指向别的东西,其他一些内存区域),而不是引用指向的值(不是该内存区域的内容)。
答案 2 :(得分:1)
我认为这种方法命名不佳。这个方法的作用是它遍历左节点直到它到达最左边的叶子然后它返回它。 __更新__ 第二个想法:实际上最左边的叶子是树的最小节点。所以这很有道理。我的坏。
您不应该更改树的根。这是你的切入点。相反,你想要记住它。如果它是一棵平衡的树,它有点保持树的中点(或重心)。所以这很重要。
答案 3 :(得分:1)
在java中调用方法时,将对象通过引用传递给一个名为&#34; t&#34;的新变量。在你的方法findMin。您正在更改&#34; t&#34;在你的while block中,这就是全部。但不是你的树根节点。
将此作为一个小测试:
public class RefTest {
static String nameM2 = "Italy";
public static void main(String[] args) {
String nameM = "Spain", nameF = "France";
System.out.println(nameM+", "+nameF);
change(nameM);
System.out.println(nameM+", "+nameF);
}
private static void change(String param) {
param = nameM2;
}
}
如果你启动它,这不是输出:
Spain, France
Italy, France
相反,这是:
Spain, France
Spain, France
因为您更改了param对象中的引用,但是在更改方法之后永远不会再使用它。
答案 4 :(得分:0)
您不想更改root的实际值,这就是您使用t的原因。 并调用传递root的方法。 Root保持不变,并完成所有工作。