Hoppa till innehåll

Postorder-traversering

↑

Detta är en vanlig djupet-först-ordning för binära träd. Skillnaden är när den aktuella noden behandlas i förhållande till rekursionen i vänster och höger delträd.

Vänster delträd, sedan höger delträd, därefter roten. För exempeltträdet med A som rot, B och C under, samt D/E och F/G längst ned, blir ordningen:

D, E, B, F, G, C, A.

Varje nod behandlas en gång. Det som ändras i koden är placeringen av output.Add eller push_back. Själva trädstrukturen är oförändrad.

ABCDEFG

Besöksordning hittills: –

Rekursionsstack: –

Försök förutsäga nästa nod innan du trycker på Nästa steg. Inorder är definierat för träd med vänster och höger barn.

Växla mellan ordningarna, förutsäg nästa markerade nod och studera de aktiva rekursionsanropen. Stacken visar vilka anrop som är aktiva när varje nod behandlas.

Postorder passar när barnen måste behandlas före föräldern, exempelvis vid utvärdering av uttrycksträd eller bearbetning av beroende delträd. Till skillnad från BFS följs en gren djupare innan återstående grenar behandlas.

C# | Postorder.cs
using System.Collections.Generic;
public sealed class Node
{
public int Value { get; }
public Node? Left { get; set; }
public Node? Right { get; set; }
public Node(int value) => Value = value;
}
static void Traverse(Node? node, List<int> output)
{
if (node is null) return;
Traverse(node.Left, output);
Traverse(node.Right, output);
output.Add(node.Value);
}

Båda versionerna besöker var och en av n noder en gång, vilket ger O(n) tid. Rekursionsstackens extraminne är O(h) där h är trädets höjd. Utdatalistan tar dessutom O(n) om resultaten lagras. Om du behandlar värden direkt behöver du inte spara alla resultat. För balanserade binära träd är h O(log n); för skeva träd kan h bli O(n), vilket kan ge djup rekursion.

Övning: Vad blir ordningen i ett träd där roten bara har ett högerbarn? Vad ändras om du flyttar raden som lägger till resultatet?

Läs vidare om jämförelse av traversering och nivåordning.

Referens: W3Schools postorder.