Страница 1 из 1
из массива в дерево
Добавлено: 06 дек 2005, 10:37
swentorog
Добрый день!
может кто сталкивался с проблемой: нужно из массива сформировать дерево. Например из
Код: Выделить всё
1|a|itm01
1|a|itm02
1|a|itm03
1|b|itm04
1|b|itm05
1|c|itm06
2|a|itm07
2|b|itm08
2|c|itm09
3|b|itm10
3|b|itm11
сформировать дерево
Код: Выделить всё
1
a
itm01
itm02
itm03
b
itm04
itm05
c
itm06
2
a
itm07
b
itm08
c
itm09
3
b
itm10
itm11
Буду рад любым советам, в т.ч. ссылкам, исходникам (паскаль, с, джава)
Добавлено: 06 дек 2005, 14:27
Kolinus
Книга Вирта "Алгоритмы и структуры данных" если не ошибаюсь в названии

там есть все
только у тебя не совсем дерево если честно. - у дерева корень ОДИН
Добавлено: 07 дек 2005, 02:42
BAHTY3
Не обязательно... дерево есть гарф, а граф может быть несвязным...
Добавлено: 07 дек 2005, 06:44
evgeny_d
Не обязательно... дерево есть гарф, а граф может быть несвязным...
Ага. Окунь есть рыба, а рыба может быть селедкой.
Ежели мне не изменяет память, то дерево - это связный граф без циклов.
У слову в теории графов есть специальный термин:
лес - для графа состоящего из нескольких
связных подграфов - деревьев, который в свою очередь деревом не является.
Добавлено: 07 дек 2005, 09:58
swentorog
у меня есть ОДИН корень. данный массив "принадлежит" этому корню.
Добавлено: 11 дек 2005, 19:40
Oscar
Java 1.5
Код: Выделить всё
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
public class Test {
public static void main(String[] args) {
ArrayList<String> array = new ArrayList<String>();
array.add("1|a|itm01");
array.add("1|a|itm02");
array.add("1|a|itm03");
array.add("1|b|itm04");
array.add("1|b|itm05");
array.add("1|c|itm06");
array.add("2|a|itm07");
array.add("2|b|itm08");
array.add("2|c|itm09");
array.add("3|b|itm10");
array.add("3|b|itm11");
ArrayList<Hashtable<Character, ArrayList<String>>> tree = new ArrayList<Hashtable<Character, ArrayList<String>>>();
tree.add(0, new Hashtable<Character, ArrayList<String>>());
for(int i = 0; i < array.size(); i++) {
String[] one = array.get(i).split("\\|");
int first = Integer.parseInt(one[0]);
Character second = one[1].charAt(0);
String third = one[2];
Hashtable<Character, ArrayList<String>> secondLevel = null;
if (first >= tree.size()) {
secondLevel = new Hashtable<Character, ArrayList<String>>();
tree.add(first, secondLevel);
}
secondLevel = tree.get(first);
if (secondLevel == null)
secondLevel = new Hashtable<Character, ArrayList<String>>();
ArrayList<String> thirdLevel = secondLevel.get(second);
if (thirdLevel == null)
thirdLevel = new ArrayList<String>();
thirdLevel.add(third);
secondLevel.put(second, thirdLevel);
tree.set(first, secondLevel);
}
for(int first = 1; first < tree.size(); first++) {
System.out.println(first);
Hashtable<Character, ArrayList<String>> firstLevel = tree.get(first);
Enumeration<Character> secondLevel = firstLevel.keys();
while(secondLevel.hasMoreElements()) {
Character second = secondLevel.nextElement();
System.out.println("\t" + second);
ArrayList<String> thirdLevel = firstLevel.get(second);
for(int i = 0; i < thirdLevel.size(); i ++) {
String third = thirdLevel.get(i);
System.out.println("\t\t" + third);
}
}
}
}
}
Hashtable не сохраняет порядка.