В последнее время я думал и предложил два варианта поиска обхода порядка 2-3-4. Один из них - это рекурсивный подход с ключом переключения на тип узла, а другой - итеративный подход. Для фона цель этого обхода состоит в том, чтобы создать следующий набор элементов из дерева выше этого.Traversing 2-3-4 Tree
[S]
/ \
[J O] [U]
/ | \ /\
[EH] [MN] [PQR] [T] [VWX]
{ {E} {H} {J} {M} {N} {O} {P} {Q} {R} {S} {T} {U} {V} {W} {Z} }
Поскольку может быть только 2 3 или 4 детей на узле у меня была идея, что любой из следующих подходов будет работать (псевдо-код).
Первый способ заключается в рекурсию от корня левого, среднего левого, среднего, справа, при необходимости, в зависимости от текущего размера узла:
list = new list
234InOrder(Node cur):
switch(cur.numElems)
case 1: // 2-node
234InOrder(cur.child[0])
list.add(cur.child[0])
234InOrder(cur.child[1])
break;
case 2: // 3-node
234InOrder(cur.child[0])
list.add(cur.child[0])
234InOrder(cur.child[1])
list.add(cur.child[1])
234InOrder(cur.child[2])
break;
case 3: // 4-node
234InOrder(cur.child[0])
list.add(cur.child[0])
234InOrder(cur.child[1])
list.add(cur.child[1])
234InOrder(cur.child[2])
list.add(cur.child[2])
234InOrder(cur.child[3])
break;
Или итеративно идти в крайнее левое положение узел, «получить» каждый элемент из этого узла, вернуться к родительскому, перейти к следующему ребенку, повторить процесс. После того, как все дети будут замечены, перейдите к parent/root и повторите процесс, начиная с преемника корневого каталога root (извините не псевдокод).
Какой из этих методов был бы лучше для получения желаемого набора элементов внутри дерева?