В нерекурсивном обходе прелюдии, среднего и постороннего порядка, пост -заказ является наиболее проблематичным. хранить в стеке.
Есть много методов.
Код кода копирования следующим образом:
Typedef struct {node * p;
LastorderTraverse (bitree bt) {
// Сначала начните с корневого узла, перейдите в слева внизу, идите к голове и введите каждый узел по пути в стек.
p = bt;
Пока (Bt)
push (bt, 0);
bt = bt.lchild;
}
// затем введите корпус цикла
While (! Stack.empty ()) {// пока стек не пуст
sn = stack.gettop (); // sn - верхний узел стека
// Примечание, любой узел n, если у него есть левый ребенок, после n входит в стек, левый ребенок N должен следовать за стеком (это отражается во второй половине алгоритма), поэтому, когда мы получаем Стете, когда верхний элемент, вы можете быть уверены, что этот элемент либо не имеет левого ребенка, либо его левого ребенка был доступен, поэтому в настоящее время мы не заботимся о его левом ребенке, мы заботимся только о его правом ребенке.
// Если доступ к правильному ребенку, или у элемента нет подходящего ребенка, определение последовательного прохождения пост может быть проведено.
if (! sn.p.rchild || sn.rvisited) {{{
p = pop ();
посещение (P);
}
Else // Если его правильный ребенок существует, а RVISITED - 0, это означает, что правильный ребенок, который не переехал, не был перемещен раньше, поэтому он будет иметь дело со своим правильным ребенком.
{{
// В это время мы должны пойти в нижнюю часть слева от узла правого ребенка до конца и поместить все узлы на этот путь в стек.
//, конечно, установите rvisited узел на 1 перед входом в стек, потому что стек правильного ребенка означает, что к его правильному ребенку будет доступ к нему до него (это хорошо понятно, потому что мы всегда следуем от наблюдения за Элемент стека для посещения). Можно видеть, что когда элемент находится на вершине стека, правильный ребенок должен быть передан при посещении, поэтому RVISITED можно установить на 1 здесь.
sn.rvisited = 1;
// Перейдите к концу влево и поместите все элементы на путь в стек
p = sn.p.rchild;
While (p! = 0) {
push (p, 0);
p = p.lchild;
}
} // Этот цикл закончился.
}
}