webForumDet fria alternativet

Balansera ett binärt träd

C/C++ur C/C++

9 svar · 797 visningar · startad av SPiN

Medlem sedan mars 20007 896 inlägg
Frågan#1

Hej där!

Jag sitter och filar på mina C/C++-kunskaper för tillfället, och arbetar med binära träd och C. Nu är det så att jag skulle behöva en metod för att balansera upp ett träd, och jag kommer ingenvart alls. Någon som kan förklara för mig hur jag bör göra, och kanske bidra med lite psuedokod? :)

Ponera att jag bygger mitt binära träd utifrån:

struct BinaryTree {
     int mID;
     struct BinaryTree* mLeft;
     struct BinaryTree* mRight;
};

typedef struct BinaryTree Bt;

Jag lägger till en nod med:

void add( Bt** tree, Bt* node ) {
     if( *tree == NULL )
          *tree = node;
     else if( (*tree)->mID > node->mID )
          add( &(*tree)->mLeft );
     else
          add( &(*tree)->mRight );
}

Variabeln mID i BinaryTree har ett unikt värde.

Medlem sedan aug. 20021 752 inlägg
#2

Vad jag vet så finns det 2 sätt att balansera trädet, under körning, typ Red-Black tree som är det Javas Tree klasser använder, den andra metoden är att man helt enkelt lägger ner trädet i en sorterad array och sedan skapar det på nytt, då blir det perfekt balanserat.
För Red-Black kan du söka på internet, det finns mycket info om det.

/Viktor

Medlem sedan mars 20007 896 inlägg
#3

Tack! Jag har sökt tidigare, men inte hittat något riktigt konkret och det lilla jag hittade förstod jag mig inte på. :OO :)

Tack igen. :)

Medlem sedan sep. 20005 700 inlägg
#4

Du kan använda dej av AVL Tree vilket är ett balanserat binärt sökträd. Googla efter AVL tree eller kolla här. Denna sida förklarar lite hur AVL Tree fungerar och den verkar även ha exempelkod. :)

Medlem sedan mars 20007 896 inlägg
#5

Jo, jag vet om AVL. Men jag vill ju skriva mitt eget träd. :)

Medlem sedan sep. 20005 700 inlägg
#6

Ja? Du får ju skriva ditt egna AVL-träd istället för ett vanligt binärt träd.

Medlem sedan mars 20007 896 inlägg
#7

Jag vet, det jag menade var att jag vill fortsätta med det träd jag redan har. Jag har redan skrivit en hel del, och vill inte anpassa mig efter AVL eftersom att det ändå går att lösa. :)

Medlem sedan dec. 2000399 inlägg
#8

Jag förstår inte hur du menar. Om du inte vill ändra något i din datatyp så använd AVL-träd och räkna ut höjden dynamiskt. Det förstör komplexiteten men det fungerar.

Om du ska använda röd-svarta träd måste du ju lagra färgen på noden på något sätt. Eller har jag missförstått något?

Medlem sedan mars 20007 896 inlägg
#9

Jag tänkte inte använda mig av Red Black-algoritmen heller, utan skyffla ner allt i en array och sedan sortera ut det på rätt ställen i trädet. På så sätt behöver jag endast skapa nya metoder och funktioner för att få det att fungera. Med AVL behöver jag ändra i mina redan existerande metoder/funktioner, samma med Red Black.

Medlem sedan dec. 2000399 inlägg
#10

Ok, då förstår jag. Det kan nog vara en god idé, det är klurigt att rotera :)

140 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
132 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)