Ben düzgün soru sormadınız hissediyorum. Bir de sipariş Çapraz geçiş tekrarlı versiyonunu uygulayan düşünmek nasıl sorusunu yanıtlamaya çalışacağım (Sadece bu biraz düşündüm ve çok yakın zamanda uygulayan olur. Ben bu aşağı koyarak çok kendim yardımcı olacaktır hissetmek ) bir özyinelemeli versiyonunu bilir ki.
Bir özyinelemeli sürümünde Her işlev çağrısı işlev çağrısı ile ilişkili düğüm ziyaret etmek istiyor. Bu örneğin, ana iş düğümün ziyaret önce fonksiyon bir düğüme ilgili aktivasyon çerçeve sistemi, yığın (bu işlemin yığın alanı) üzerine kaydedilir şekilde kodlanır. Biz düğüm kendisi ziyaret etmeden önce düğümün sol alt ağacı ziyaret etmek istiyorum, çünkü bu böyledir.
sol alt ağaç ziyaret edildikten sonra, iç yığın ve bizim düğüme ziyaretten aynı haşhaş dil ortamında bizim kaydedilmiş düğüm sonuçlarının çerçevesine dönüş artık izin verilir.
Bu itme ve açık bir deste ile haşhaş taklit gerekiyor.
template<class T>
void inorder(node<T> *root)
{
// The stack stores the parent nodes who have to be traversed after their
// left sub-tree has been traversed
stack<node<T>*> s;
// points to the currently processing node
node<T>* cur = root;
// Stack-not-empty implies that trees represented by nodes in the stack
// have their right sub-tree un-traversed
// cur-not-null implies that the tree represented by 'cur' has its root
// node and left sub-tree un-traversed
while (cur != NULL || !s.empty())
{
if (cur != NULL)
{
for (; cur->l != NULL; cur = cur->l) // traverse to the leftmost child because every other left child will have a left subtree
s.push(cur);
visit(cur); // visit him. At this point the left subtree and the parent is visited
cur = cur->r; // set course to visit the right sub-tree
}
else
{// the right sub-tree is empty. cur was set in the last iteration to the right subtree
node<T> *parent = s.top();
s.pop();
visit(parent);
cur = parent->r;
}
}
}
Bunu anlamak için en iyi yolu, her çağrı ve özyinelemeli versiyonunun dönüşü kağıt üzerinde iç yığınının işleyişini çekmektir.