Hoppa till innehåll

Preorder-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.

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

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

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.

Preorder passar när föräldern ska behandlas före barnen, exempelvis vid prefixnotation eller när en trädstruktur kopieras. Till skillnad från BFS följs en gren djupare innan återstående grenar behandlas.

C# | Preorder.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;
output.Add(node.Value);
Traverse(node.Left, output);
Traverse(node.Right, output);
}

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 preorder.