首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索树,修改不保存

搜索树,修改不保存
EN

Stack Overflow用户
提问于 2015-07-12 13:22:20
回答 2查看 35关注 0票数 0

我目前正在尝试使用搜索树来实现一个字典。(练习告诉我使用这样的结构)。我的树是由保存两个字符串的节点组成的:缩写(短语的缩写)和缩写(短语)。到目前为止,我的实现情况如下:

节点类:

代码语言:javascript
复制
public class Nod {
    String acronim;
    String abreviere;
    Nod st,dr;

    Nod(String acronim,String abreviere){
        this.acronim = acronim;
        this.abreviere = abreviere;
        st = null;
        dr = null;
    }
}  

树类:

构造函数并插入:

代码语言:javascript
复制
public class Arbore {

    Nod root;
    Arbore(Nod x){
        root = x;
    }

    public void insert(Nod x,Nod curr){
        if(curr.acronim.compareTo(x.acronim) < 0){
           if(curr.st == null){
               curr.st = new Nod(x.acronim,x.abreviere);
           }
           else insert(x,curr.st);
        }
        else if(curr.dr == null){
                curr.dr = new Nod(x.acronim, x.abreviere);
            }
            else insert(x,curr.dr);
    }
}  

我让他们去工作了。我不明白为什么我不能用这个代码来代替:

代码语言:javascript
复制
public class Arbore {

Nod root;
Arbore(){

}

public void insert(Nod x,Nod curr){
    if(curr == null) {curr = x; return;}
    if(curr.acronim.compareTo(x.acronim) < 0){
       if(curr.st == null){
           curr.st = new Nod(x.acronim,x.abreviere);
       }
       else insert(x,curr.st);
    }
    else if(curr.dr == null){
            curr.dr = new Nod(x.acronim, x.abreviere);
        }
        else insert(x,curr.dr);
}  

这也不能挽救我的结构(我显然遗漏了一些东西,而且似乎是相关的)。我现在面临的问题是删除一个节点。我必须搜索一个缩写(缩写),如果我找到它,我必须打印短语并删除节点。以下是我用来做这件事的方法:

代码语言:javascript
复制
public void search(String acronim){
        if(root.acronim.compareTo(acronim) == 0) delete(root);

        if(root.acronim.compareTo(acronim) < 0) search(acronim,root.st);
        if(root.acronim.compareTo(acronim) > 0) search(acronim,root.dr);
    }

    private void search(String acronim,Nod curr){
        if(curr == null){System.out.println("Nu exista"); return;}
        if(curr.acronim.compareTo(acronim) == 0) this.delete(curr);

        if(curr.acronim.compareTo(acronim) < 0) this.search(acronim,curr.st);
        if(curr.acronim.compareTo(acronim) > 0) this.search(acronim,curr.dr);
    }

    private void delete(Nod x){
        if(x.st == null && x.dr == null){ x = null; System.out.println("deleting");}
        else if(x.st == null && x.dr != null) {x = x.dr;System.out.println("deleting right");}
        else if(x.st != null && x.dr == null) {x = x.st;System.out.println("deleting left");}
        else{
            System.out.println("Il deletez");
            Nod aux = new Nod(x.acronim,x.abreviere);
            x.abreviere = x.st.abreviere;
            x.acronim = x.st.acronim;

            x.st.abreviere = aux.abreviere;
            x.st.acronim = aux.acronim;

            delete(x.st);    
        }

    }

他们似乎做了这项工作(从印刷的信息)。但是,在我应用该方法之后,这些更改不会保存,只剩下相同的树。下面是显示当前树的打印方法:

代码语言:javascript
复制
public String inordine(Nod root){
    if(root == null) return "";
    return inordine(root.st) + afis(root) + inordine(root.dr);
}

private String afis(Nod n){
    if(n == null) return "E nula?!";
    return n.abreviere + "->" + n.acronim + "\n";
}

public void afisare(){
    System.out.println(inordine(this.root));
}

我做错了什么?是垃圾收集器还是什么?我用我的课像这样:

代码语言:javascript
复制
public static void main(String[] args) throws FileNotFoundException, IOException {
        FileReader fr = new FileReader("Acronime.txt");
        BufferedReader bf = new BufferedReader(fr);

        String line = bf.readLine();
        String[] array = line.split("=>");
        Nod x = new Nod(array[0],array[1]);
        Arbore a = new Arbore(x);

        while((line = bf.readLine()) != null){
            String[] array2 = line.split("=>");
            Nod y = new Nod(array2[0],array2[1]);
            a.insert(y,a.root);
        }

        a.afisare();

        a.search("JSE");
        a.afisare();
    }  

这句话是这样说的,但这部分起作用了。

代码语言:javascript
复制
JSE=>JavaScript Encoding
ESP=>Enhanced Serial Port
MSB=>Most Significant Byte
CDRAM=>Cached Dynamic RAM
EMI=>Electro-Magnetic Interference
CDRAM=>Cached Dynamic RAM
AIFF=>Audio Interface File
BASM=>Built in AsseMbler

在查看建议的post后,我在delete方法中更改了2行,并添加了1多个方法:

更改行:

代码语言:javascript
复制
else if(x.st == null && x.dr != null) {copy(x,x.dr); x.dr = null; System.out.println("deleting right");}
        else if(x.st != null && x.dr == null) {copy(x,x.st); x.st = null; System.out.println("deleting left");}  

这样,变化就会持续下去(如果你想知道为什么要阅读下面建议的帖子中的问题)。

最后的问题是:“如何删除一个类的实例,因为您不能使用x= null;?”

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-12 14:39:24

您不能像我在delete方法if(x.st == null && x.dr == null){ x = null;}中尝试的那样破坏java中的类实例。要从树中删除节点,必须找到x的父节点,然后再找到parent.x = null。这样,对x的引用就会丢失,垃圾收集器就会完成他的工作。

这是因为,就像@Seelenvirtuose说的那样,java使用的是按值传递的方法,您可以在他提供的链接中更多地了解它:click!

票数 0
EN

Stack Overflow用户

发布于 2015-07-12 13:43:52

关于构造函数的

在您希望使用的方法(与空构造函数一起使用)中,需要在某个时候设置类成员root。像这样的事情应该可以做到:

代码语言:javascript
复制
public void insert(Nod x,Nod curr){
  if(curr == null) {
    this.root = x; 
    return;
  }
  ...

关于删除

我不明白当st和dr不为空时的情况。您似乎保持树结构完整,但是切换st侧的有效负载数据(缩写,缩写),然后删除st节点。我还不明白。当我更好地理解时,我会更新我的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31368223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档