2015-06-21 54 views
1

我最近一直在研究二叉搜索树及其在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”我把返回二叉树的minimimum元素中的“根”,但最终没有按”这种方法改变了“根”的值?其实我知道它不会改变它,但我不明白为什么。

+0

在我们可以客观回答这个问题之前,我们可以假设'AnyType'包含一个'getValue()'方法,它可以解析某种'Number'?或者'AnyType'实现'Comparable'? – Makoto

回答

0

你不想改变root的实际值,这就是你使用t的原因。 并调用传递root的方法。 Root保持不变,并完成所有工作。

2

树没有任何变化。 t是您插入该方法的任何节点的临时替代品。这是一样的,当你这样做:

int x = 5; 
int y = x + 1; 
System.out.println(x); 
System.out.println(y); 

输出将仍然是:

+0

是的,但在这种情况下,x,y是原始数据类型,并且我认为由于“t”是一个通过引用传递的对象,因此根应该更改 – enu

1

的方法改变了方法参数的值来自堆栈,并且该值是一个参考。所以你改变引用(这意味着指向别的东西,一些其他的内存区域),而不是引用指向的值(而不是该内存区域的内容)。

1

我认为这种方法名字很差。这种方法所做的是通过左节点迭代,直到它到达最左边的叶子,然后返回它。 __Update__第二个想法:实际上最左边的叶子是树的最小节点。所以这是有道理的。我的错。

你不应该想改变树的根。这是你的切入点。相反,你想记住它。如果它是一棵平衡树,它可以保持树的中点(或重心)。所以这很重要。

+0

握住电话;这是[二叉树](https://en.wikipedia.org/?title=Binary_tree),不一定是[binary * search * tree](https://en.wikipedia.org/wiki/Binary_search_tree)。 *两者之间存在差异。我不相信迭代所有左边是正确的方法。 – Makoto

+0

问题@ElioNushi提到它是一个binart搜索树,对吗? – Alp

+0

我所看到的只是他提到他正在研究它,并不一定表明我们正在展示*是一个BST。 – Makoto

1

当您在java中调用方法时,通过引用将对象传递给您的方法findMin中名为“t”的新变量。你正在改变你的时间块中的“t”的参考,就是这样。但不是你的树根节点。

以此为一个小测试:

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对象中的引用,但在退出变更方法后再也不会再使用它。