Java, как создать и упорядочить древовидную структуру с помощью рекурсии и узлов? - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь создать код из ArrayList of Nodes для создания древовидной структуры для разбора и печати филогенетических деревьев.При синтаксическом анализе с использованием этой рекурсивной функции кажется, что некоторые элементы не учитываются и не вставляются туда, где они должны быть.

{
public void buildTree(ArrayList<Node> T) {

        for(int i = 0; i < T.size()-1; i++) {
            for( int j = i+1; j < T.size()-1; j++) {
                while(j < T.size() && T.get(j).name.startsWith(T.get(i).name)) {
                    T.get(i).children.add(T.get(j));
                    T.remove(j);
                    Collections.sort(T.get(i).children, NAME);
                    buildTree(T.get(i).children);

                }

            }

        }
    }
}

Этот код принимает список узлов, сравнивает каждый узел друг с другомузел и добавляет его в свою ветвь, если его потомок (сравнение String.startsWith ()).Я должен был увидеть этот результат:

{
*
|-AAAAGAC
| |-AAAAGACTGG
|-AAAATC
|-AAATA
|-AAATCGA
|-AAATT
| |-AAATTAAG
| |-AAATTC
| | |-AAATTCAAC
| | | |-AAATTCAACA
| | | |-AAATTCAACG
| | | |-AAATTCAACT
| | | | |-AAATTCAACTA
| | | | |-AAATTCAACTT
| | |-AAATTCCGA
}

Но вместо этого я продолжаю получать это:

{
*
|-AAAAGAC
| |-AAAAGACTGG
|-AAAATC
|-AAATA
|-AAATCGA
|-AAATT
| |-AAATTAAG
| |-AAATTC
| | |-AAATTCAAC
| | | |-AAATTCAACA
| | | |-AAATTCAACG
| | | |-AAATTCAACT
| | | |-AAATTCAACTA <<<<<<<<< Needs one more indent.
| | | | |-AAATTCAACTT
| |-AAATTCCGA <<<<<<<<< Needs one more indent.
}

Почему код дает слишком мало отступов?

1 Ответ

0 голосов
/ 02 марта 2019

Вы пропускаете отступы, потому что вы управляете случаем, когда узел "j" является дочерним по отношению к узлу "i" (во вложенных циклах), но вы также должны управлять случаем, когда узел "j" является родительским по отношению к узлу "i "(и проверьте, является ли родительский элемент узла" i "также родительским для узла" j ").

Существуют различные способы исправить код;но, возможно, если вы отсортируете (в алфавитном порядке) весь ваш массив перед вызовом buildTree и оставите метод без изменений, вы должны получить правильное дерево.

...