في الترتيب غير المتواصل للمرور ، فإن "Post -Offer" هو الأكثر إثارة للقلق. يتم تخزينها في المكدس.
هناك العديد من الطرق.
نسخ رمز رمز على النحو التالي:
Typedef struct {node * p ؛
LastOrderTraverse (bitree bt) {
// أولاً ، ابدأ من عقدة الجذر ، انتقل إلى أسفل اليسار ، انتقل إلى الرأس ، وأدخل كل عقدة على المسار في المكدس.
p = bt ؛
بينما (BT)
Push (BT ، 0) ؛
bt = bt.lchild ؛
}
// ثم أدخل جسم الدورة
بينما (! stack.empty ()) {// طالما أن المكدس ليس فارغًا
SN = stack.gettop () ؛
// ملاحظة ، أي عقدة n ، طالما أن لديه طفل يسار ، بعد أن دخل المكدس ، يجب أن يتبع الطفل الأيسر من N المكدس (ينعكس هذا في النصف الثاني من الخوارزمية) ، لذلك عندما نحصل على stack عندما العنصر العلوي ، يمكنك التأكد من أن هذا العنصر إما ليس له طفل يسار أو أن طفله الأيسر قد تم الوصول إليه ، لذلك في هذا الوقت لا نهتم بطفله الأيسر ، نحن نهتم فقط بطفله الأيمن.
// إذا تم الوصول إلى الطفل المناسب ، أو أن العنصر لا يحتوي على الطفل المناسب ، فيمكن أن يتم نقل تعريف ما بعد التوقيت.
if (! sn.p.rchild || sn.rvisited) {{
p = pop () ؛
زيارة (P) ؛
}
آخر // إذا كان طفلها الصحيح موجودًا و rvisited هو 0 ، فهذا يعني أن الطفل المناسب الذي لم يتحرك لم يتم نقله من قبل ، لذلك سوف يتعامل مع طفله المناسب.
{{
// في هذا الوقت ، علينا أن نذهب إلى أسفل اليسار من عقدة الطفل الأيمن حتى النهاية ، ووضع جميع العقد على هذا المسار في المكدس.
// بالطبع ، قم بتعيين rvisited من العقدة إلى 1 قبل الدخول إلى المكدس ، لأن كومة الطفل المناسب تعني أنه سيتم الوصول إلى طفلها المناسب قبل ذلك (هذا مفهومة جيدًا لأننا نتبع دائمًا من الملاحظة خذ عنصر المكدس للزيارة). يمكن ملاحظة أنه عندما يكون العنصر في الجزء العلوي من المكدس ، يجب تمرير الطفل المناسب بالزيارة ، بحيث يمكن ضبط RVisited على 1 هنا.
sn.rvisited = 1 ؛
// انتقل إلى النهاية إلى أسفل اليسار ووضع جميع العناصر على المسار في المكدس
p = sn.p.rchild ؛
بينما (p! = 0) {
دفع (p ، 0) ؛
P = P.Lchild ؛
}
} انتهت هذه الدورة.
}
}