В предыдущей статье я сказал, что рекурсивный алгоритм календаря обхода (первое корень бинарного дерева (первая последовательность).
Суммируйте нерекурсивный алгоритм первого обхода.
1) Введите стек, в основном, чтобы войти в стек -первый узел, а затем посетите этот узел
2) пока
3) Правильный ребенок узела IF верно, переносить 1) продолжать пересекать, в противном случае текущий узел будет выходить и перенесен в родительский узел, пересекающий 1)
Сначала посмотрите на алгоритм, который соответствует этой идее:
Код кода копирования следующим образом:
Int preordertraversenonrcursiveex (const bitree & t, int (*visitnode) (данные Telemtype))
{{
if (t == null)
{{
Возврат -1;
}
Bitnode *pbinode = t;
SQStack S;
Initstack (& s);
Push (& s, (selectype) t);
В то время как (! Isstackedy (ы))
{{
В то время как (Pbinode)
{{
Посещение (Pbinode-> data);
if (pbinode! = t)
{{
Push (& s, (selectype) pbinode);
}
pbinode = pbinode-> lchild;
}
if (pbinode == null)
{{
Pop (& s, (selemtype*) & pbinode);
}
if (pbinode-> rchild == null)
{{
POP (& S, (SELEMTYPE*) & PBINODE);
}
pbinode = pbinode-> rchild;
}
Возврат 0;
}
Примечание: 1) здесь используется структура стека, и вы можете увидеть стек, хранящийся в порядке структуры выше
2) При сохранении узла здесь я сохраняю адрес указателя, то есть адрес узела, превращая его в хранилище int. Именно зачем вы думаете об использовании указателей?
Приведенный выше алгоритм на самом деле неверен! Почему? Здесь я проверял долгое время. Потому что, если стек пуст после поп -музыки, но есть правильное дерево, он не будет продолжаться. Когда левое детское дерево пустое, следующим образом: следующее:
Код кода копирования следующим образом:
Int preordertraversenonrcursive (const bitree & t, int (*visitnode) (данные Telemtype))
{{
if (t == null)
{{
Возврат -1;
}
Bitnode *pbinode = t;
SQStack S;
Initstack (& s);
Push (& s, (selectype) t);
В то время как (! Isstackedy (ы))
{{
GetTop (s, (selectype*) & pbinode);
В то время как (Pbinode)
{{
Посещение (Pbinode-> data);
pbinode = pbinode-> lchild;
Push (& s, (selectype) pbinode);
}
if (pbinode == null)
{{
Pop (& s, (selemtype*) & pbinode);
}
if (! Isstackedy (ы))
{{
Pop (& s, (selemtype*) & pbinode);
pbinode = pbinode-> rchild;
Push (& s, (selectype) pbinode);
}
}
Возврат 0;
}
Это так. Нажмите на него в правый дочерний узел, а затем определите, пуста ли левый ребенок правого дерева, и продолжить цикл.
Здесь есть две отходы: одна должна протолкнуть узлы пустого ребенка, чтобы войти в стек, а другой - часто использовать GetTop, чтобы получить верхний элемент стека
Вернитесь сюда, чтобы увидеть, как алгоритм, разработанный, где нулевый узел не нажимает в нулевый указатель или пустого ребенка, но он не может быть полностью выведен. Нуль -это ноль, так что это, так что не будет смущения, которое не будет отображать узел правого подзаможного дерева, следующим образом: следующим образом:
Код кода копирования следующим образом:
// нерекурсивно пересекающее бинарное дерево
Int preordertraversenonrcursiveex (const bitree & t,
Int (*visitnode) (данные телемтипа))
{{
if (t == null)
{{
Возврат -1;
}
Bitnode *pbinode = t;
SQStack S;
Initstack (& s);
Push (& s, (selectype) t);
While (! Isstackedy (s) || pbinode) // Основная модификация - это предложение
{{
В то время как (Pbinode)
{{
Посещение (Pbinode-> data);
if (pbinode! = t)
{{
Push (& s, (selectype) pbinode);
}
pbinode = pbinode-> lchild;
}
if (pbinode == null)
{{
Pop (& s, (selemtype*) & pbinode);
}
if (pbinode-> rchild == null)
{{
POP (& S, (SELEMTYPE*) & PBINODE);
}
pbinode = pbinode-> rchild;
}
Возврат 0;
}
После первого петля добавлено, это достаточно. Следующим образом, проверьте двоичное дерево в предыдущем разделе:
В настоящее время входные данные по -прежнему 12 34 0 0 78 0 0. Результаты теста следующие:
--- Bitree ---
Пожалуйста, введите данные узла Bitree:
12
Пожалуйста, введите данные узла Bitree:
34
Пожалуйста, введите данные узла Bitree:
0
Пожалуйста, введите данные узла Bitree:
0
Пожалуйста, введите данные узла Bitree:
78
Пожалуйста, введите данные узла Bitree:
0
Пожалуйста, введите данные узла Bitree:
0
12 34 78
Этого недостаточно, чтобы проверить, посмотрите на следующее бинарное дерево
В настоящее время входные данные должны быть: 12 34 24 0 0 0 0 0 0 78 37 0 0 0. Результаты теста следующие:
--- Bitree ---
Пожалуйста, введите данные узла Bitree:
12
Пожалуйста, введите данные узла Bitree:
34
Пожалуйста, введите данные узла Bitree:
двадцать четыре
Пожалуйста, введите данные узла Bitree:
0
Пожалуйста, введите данные узла Bitree:
0
Пожалуйста, введите данные узла Bitree:
50
Пожалуйста, введите данные узла Bitree:
0
Пожалуйста, введите данные узла Bitree:
0
Пожалуйста, введите данные узла Bitree:
78
Пожалуйста, введите данные узла Bitree:
37
Пожалуйста, введите данные узла Bitree:
0
Пожалуйста, введите данные узла Bitree:
0
Пожалуйста, введите данные узла Bitree:
0
12 34 24 50 78 37
Из предварительного обхода видно, что это правильно. , а затем добавьте его, чтобы присоединиться к подходящей позиции.