当前位置: 首页 > 知识库问答 >
问题:

如何获得泛型树中节点的级别?

董弘新
2023-03-14

给定一个实现为根节点的泛型树,该根节点具有子节点列表,子节点是节点,并且每个节点都具有其子节点列表。

   __A__ 
  /  |  \
 B   C   D
 |  / \
 E  F  G 

节点a具有其子节点的列表:B、C、D

B、C、D也有他们儿子的名单:B-->EC-->F、GD-->空

我将解释我的算法的想法,你可以修复它或给我另一个全新的想法。

public Integer level(T dato) {...}

遍历树,将树的每个节点添加到队列中,或者如果添加的最后一个节点是级别的最后一个节点,则添加一个“null”。Null是队列中的标识符,用于知道级别已结束的位置。我的问题是,我不知道第一次之后到底该把标识符放在哪里。下面是一些代码:

    public Integer level(T data){
    int inclu= this.include(data);
    if (inclu==-1) {        // if the tree doesn't include the data
        return -1;
    } else {               
        return inclu;       // returns the level
    }
}

public Integer include( T data ) {  // returns the level where the data is
    Integer inclu = -1;     // -1 if the data is not included
    if (this.getDataRoot()==data){
        return 0;       //  The root of the tree has the data
    }
    else {
        LinkedList<GenericNode<T>> queue = new LinkedList<GenericNode<T>>();

        GenericNode<T> tree = new GenericNode<T>();

        int level=1;
        queue.addAtBeginning(this.getRoot());
        queue.addAtBeginning(null);

        while (queue.size()>0 && inclu==-1) {

            if(queue.element(queue.size())!=null) {                         // if it is not the end of the level then dequeue

                tree.setData(queue.element(queue.size()).getData());        //queue.element(position) returns the element in that position
                tree.setListOfSons(queue.element(queue.size()).getSons());

                if (tree.getSons()!=null) {     // if the tree has sons
                    int i=1;
                    while(i<=tree.getSons().size() && inclu==-1) {
                        queue.addAtBeginning(tree.getSons().element(i));
                        if (tree.getSons().element(i).getData()==data)      // if I found the data I'm looking for
                            inclu=level;
                        i++;                                                // counter
                    }   
                }       
            } else {    // if it is the end of the level (means the queue gave me a null)
                level++;    
            }

            queue.delete(queue.size());         //ending the dequeue process

        } //end while
    } // end main else

    return inclu;       //returns the summation of the levels or 0 if it was found at the root of the tree or -1 if the data was not found
}

共有1个答案

越雨泽
2023-03-14

我写了一个类,它返回特定树中目标节点的级别。

import java.util.LinkedList;

import java.util.List;

public class TreeLevel {

public static class Node {
    public Node(String data) { this.data = data ; };
        public String data;
        public List<Node> childs = new LinkedList<Node>();
    }

public static Integer level(Node tree, Node target){
    return level(tree, target, 0);
}

private static Integer level(Node tree, Node target, int currentLevel) {
    Integer returnLevel = -1;        
    if(tree.data.equals(target.data)) {
        returnLevel = currentLevel;
    } else {
        for(Node child : tree.childs) {
            if((returnLevel = level(child, target, currentLevel + 1)) != -1){
                break;
            }                
        }
    }
    return returnLevel;

}

public static void main(String[] args) {

    Node a = new Node("A");
    Node b = new Node("B");        
    Node c = new Node("C");
    Node d = new Node("D");        
    Node e = new Node("E");
    Node f = new Node("F");
    Node g = new Node("G");

    // childs of a:
    a.childs.add(b);
    a.childs.add(c);
    a.childs.add(d);

    // childs of b:
    b.childs.add(e);

    // childs of c:
    c.childs.add(f);
    c.childs.add(g);

    // childs of d:
    // d.childs = null or simply d.childs.length() is 0 
    Node target = new Node("G");
    Integer level = level(a, target);
    System.out.println("level [" + level + "]");


  }
}
 类似资料:
  • 问题内容: 表-用户 列-(userId,name,managerId) 行- 如果我提供用户ID,则应列出所有向他报告的人。如果我给userId = 2,则应返回3,4。 这个查询正确吗 有什么有效的方法来管理DB中的树结构吗?左右叶方式怎么样? 问题答案: 在我看来,邻接列表模型的问题在于,在SQL中很难处理它,尤其是当您不知道树结构的嵌套深度时。 您提到的“左右叶方式”可能是嵌套集合模型,它

  • 我需要能够在运行时告诉kotlin集合的泛型类型。我怎么做?

  • 问题内容: 在C#中,我发现了一种非常可爱的方法,该方法使您可以从指定控件中获取所有后代和所有THEIR后代。 我正在寻找JavaFX的类似方法。 我看到了我要使用的类,因为它是派生所有带有孩子的Node类的类。 到目前为止,这是我所拥有的(并且我还没有在Google上通过“ JavaFX从场景中获取所有节点”之类的搜索真正找到任何东西): 那么,如何确定N是否是父母(或从父母继承)呢?我说的对吗

  • 问题内容: 我有一个泛型类。在一种方法中,我想获取的类实例,但我无法调用。 使用它解决问题的首选方法是什么? 问题答案: 简短的答案是,无法找到Java中泛型类型参数的运行时类型。我建议阅读Java教程中有关类型擦除的章节以获取更多详细信息。 一个流行的解决方案是Class将type参数的传递给泛型类型的构造函数,例如

  • 问题内容: 我有一个泛型类。在一种方法中,我想获取类型T的类实例,但是我不能调用。 使用它解决问题的首选方法是什么? 问题答案: 简短的答案是,无法找到Java中泛型类型参数的运行时类型。我建议阅读Java教程中有关类型擦除的章节以获取更多详细信息。 一个流行的解决方案是将type参数的传递给泛型类型的构造函数,例如

  • 只能在类文本的左侧使用类 是否可以像在C#中那样对泛型参数提供类约束,或者是否可以使用其他语法来获取泛型参数的类型信息?