Cum de a converti un arbore binar pentru arbore binar de căutare în loc, adică, nu putem folosi nici un spațiu suplimentar

voturi
12

Cum de a converti un arbore binar pentru arbore binar de căutare în loc, adică, nu putem folosi orice spațiu suplimentar.

Întrebat 05/04/2010 la 06:46
sursa de către utilizator
În alte limbi...                            


10 răspunsuri

voturi
0

Un arbore binar , de obicei , este un arbore binar de căutare, în cazul în care este necesară nici o conversie.

Poate că aveți nevoie pentru a clarifica structura a ceea ce sunt de conversie de la. Este arborele sursă dezechilibrată? Nu este comandat de tasta pe care doriți să căutați pe? Cum ai ajuns la arborele sursă?

Publicat 05/04/2010 la 07:00
sursa de către utilizator

voturi
0

Ei bine, în cazul în care acest lucru este o întrebare de interviu, primul lucru pe care l-aș izbucnesc (cu gândul la zero reală) este aceasta: itera întregul binar recursiv și și pentru a găsi cel mai mic element. Ia-l din copac binar. Acum, repetați procesul în care itera întregul copac și pentru a găsi cel mai mic element, și adăugați-l ca părinte al ultimului element găsit (cu elementul anterior devenind copil stâng nou nodului). Se repetă de câte ori este necesar, până când arborele original este gol. La final, au rămas cu cel mai rău posibil arbore binar sortat - o listă legată. indicatorul este îndreptat spre nodul rădăcină, care este cel mai mare element.

Acesta este un algoritm oribil all-in jurul - O (n ^ 2) timpul de funcționare cu cel mai rău posibil ieșire arbore binar, dar este un punct de plecare decent înainte de a veni cu ceva mai bun și are avantajul de a vă fi capabil să scrie codul ea în aproximativ 20 de linii pe o tablă albă.

Publicat 05/04/2010 la 07:50
sursa de către utilizator

voturi
10

Nu dau de mult pentru a merge mai departe, dar în cazul în care cerința este ceea ce cred că este, ai un arbore binar deja creat și stând în memorie, dar nu și sortate (așa cum doriți să fie sortate, oricum).

Sunt presupunând că nodurile de copac arata ca

struct tree_node {
    struct tree_node * left;
    struct tree_node * right;
    data_t data;
};

Sunt, de asemenea, presupunând că puteți citi C

In timp ce am putea sta doar în jurul întrebam de ce acest copac a fost creat vreodată fără să fi fost creat pentru sortat, care nu ne face nici un bine, așa că voi ignora și doar a face cu sortarea.

Cerința care trebuie folosit nici un spațiu suplimentar este ciudat. Temporar va exista spațiu suplimentar, în cazul în care numai pe stivă. Am de gând să se presupună că aceasta înseamnă că de asteptare malloc sau ceva de genul asta și, de asemenea, că arborele rezultat trebuie să utilizeze nu mai multă memorie decât copac nesortate originală.

Prima și cea mai simplă soluție este de a face o traversal precomandă a copacului nesortate scoate fiecare nod din acel copac și de a face o inserție sortată într - un nou copac. Aceasta este O (n + n log (n)), care este O (n log (n)).

În cazul în care acest lucru nu este ceea ce doresc și tu va trebui să folosească rotațiilor și alte chestii ..... asta e oribil!

M-am gândit că ai putea face acest lucru prin a face o versiune ciudată de un fel morman, dar am fugit în probleme. Un alt lucru care a venit în minte, ceea ce ar fi oribil lent, ar face să o versiune ciudată de sortare cu bule pe copac.

Pentru aceasta fiecare nod este comparat și, eventual schimbate cu fiecare dintre copii este directe (și, prin urmare, de asemenea, cu părintele său) în mod repetat, până când traversa copac și nu găsesc nici swap-urile necesare. Făcând un fel agitator (bule de sortare, care merge la stânga la dreapta și la dreapta la stânga) versiune a acestui ar funcționa cel mai bine, și după trecere inițială nu ar trebui să traverseze în jos subarbori care nu se uite de ordine în ceea ce privește este părinte .

Sunt sigur că nici această algorthm a fost gândită de către altcineva înaintea mea și are un nume misto pe care pur și simplu nu știu, sau că este fundamental greșită într-un mod care să nu văd.

Venind cu calculele run-time pentru a doua sugestie este destul de complicată. La început am crezut că ar fi pur și simplu O (n ^ 2), cum ar fi bule și scuturare soiuri, dar nu mă pot convinge că evitarea subramificație parcurgeri s-ar putea să nu câștige suficient pentru a face un pic mai bine decât O (n ^ 2). În esență, cu bule și scuturare felul obține această optimizare prea, dar numai la capete, unde sortedness totală are loc mai devreme și vă puteți retează limitele. Cu această versiune copac veți obține oppurtunities pentru a evita, eventual, bucăți în mijlocul setului, de asemenea. Ei bine, cum am spus, probabil în mod fatal eronate.

Publicat 05/04/2010 la 08:09
sursa de către utilizator

voturi
-1

Do inordine Traversarea arborelui binar și stoca rezultatul. sortați rezultatul pentru a forma arborele binar de căutare luând elementul de mijloc al listei sortată ca root acending (acest lucru se poate face cu ajutorul binar de căutare). așa că vom obține arbore echilibrat binar de căutare.

Publicat 15/12/2010 la 05:12
sursa de către utilizator

voturi
1

Nu următorul algoritm pentru a ajunge la soluția.

1) găsi o în ordine succesoare fără a utiliza orice spațiu.

Node InOrderSuccessor(Node node)
{ 
    if (node.right() != null) 
    { 
        node = node.right() 
        while (node.left() != null)  
            node = node.left() 
        return node 
    }
    else
    { 
        parent = node.getParent(); 
        while (parent != null && parent.right() == node)
       { 
            node = parent 
            parent = node.getParent() 
        } 
        return parent 
    } 
} 

2) Do pentru parcurgeri fără a utiliza spațiu.

a) Găsiți primul nod al traversal inordine. Ar trebui lăsat cea mai mare copil al copacului dacă are, sau la stânga primului copil drept în cazul în care are, sau în sine a copilului drept. b) utilizarea de mai sus algoritm pentru a afla inoder succesor al primului nod. c) Repetați pasul 2 pentru toți succesorul returnat.

Utilizați 2 de mai sus algoritm și de a face în ordine pe Traversarea arborelui binar fără a utiliza spațiu suplimentar. Forma arborele binar de căutare atunci când faci traversal. Dar complexitatea este O(N2)cel mai rău caz.

Publicat 15/12/2010 la 05:35
sursa de către utilizator

voturi
-1

morman sortare copac .. complexitatea nlogn ..

Publicat 13/06/2011 la 20:23
sursa de către utilizator

voturi
2

Face postordine traversal și de la care a crea un arbore binar de căutare.

struct Node * newroot = '\0';

struct Node* PostOrder(Struct Node* root)
{
      if(root != '\0')
      {
          PostOrder(root->left);
          PostOrder(root->right);
          insertBST(root, &newroot);
      }
}

insertBST(struct Node* node, struct Node** root)
{
   struct Node * temp, *temp1;
   if( root == '\0')
   {
      *root == node;
       node->left ==  '\0';
       node->right == '\0';
   }
   else
   {
       temp = *root;
       while( temp != '\0')
       {
           temp1= temp;
           if( temp->data > node->data)
               temp = temp->left;
           else
               temp = temp->right;
       }
       if(temp1->data > node->data)
       {
           temp1->left = node;
       }
       else
       {
           temp1->right = node;
       }
       node->left = node->right = '\0';
    }
}
Publicat 10/01/2012 la 05:27
sursa de către utilizator

voturi
14

Conversia binar la un copac legat de două ori lista- se poate face INPLACE în O (n)
Apoi , ordonați - l folosind îmbinare de sortare, nlogn
Conversia lista înapoi la un copac - O (n)

Soluție nlogn simplă.

Publicat 29/08/2012 la 15:37
sursa de către utilizator

voturi
0
#include <stdio.h>
#include <stdlib.h>

typedef int data_t;

struct tree_node {
    struct tree_node * left;
    struct tree_node * right;
    data_t data;
};

        /* a bonsai-tree for testing */
struct tree_node nodes[10] =
{{ nodes+1, nodes+2, 1}
,{ nodes+3, nodes+4, 2}
,{ nodes+5, nodes+6, 3}
,{ nodes+7, nodes+8, 4}
,{ nodes+9, NULL, 5}
,{ NULL, NULL, 6}
,{ NULL, NULL, 7}
,{ NULL, NULL, 8}
,{ NULL, NULL, 9}
        };

struct tree_node * harvest(struct tree_node **hnd)
{
struct tree_node *ret;

while (ret = *hnd) {
        if (!ret->left && !ret->right) {
                *hnd = NULL;
                return ret;
                }
        if (!ret->left ) {
                *hnd = ret->right;
                ret->right = NULL;;
                return ret;
                }
        if (!ret->right) {
                *hnd = ret->left;
                ret->left = NULL;;
                return ret;
                }
        hnd = (rand() &1) ? &ret->left : &ret->right;
        }

return NULL;
}

void insert(struct tree_node **hnd, struct tree_node *this)
{
struct tree_node *ret;

while ((ret= *hnd)) {
        hnd = (this->data  < ret->data ) ? &ret->left : &ret->right;
        }
*hnd = this;
}

void show(struct tree_node *ptr, int indent)
{
if (!ptr) { printf("Null\n"); return; }

printf("Node(%d):\n", ptr->data);
printf("%*c=", indent, 'L');  show (ptr->left, indent+2);
printf("%*c=", indent, 'R');  show (ptr->right, indent+2);
}

int main(void)
{
struct tree_node *root, *this, *new=NULL;

for (root = &nodes[0]; this = harvest (&root);  ) {
        insert (&new, this);
        }

show (new, 0);
return 0;
}
Publicat 24/12/2012 la 00:49
sursa de către utilizator

voturi
0
struct Node
{
    int value;
    Node* left;
    Node* right;
};

void swap(int& l, int& r)
{
    int t = l;
    l = r;
    r = t;
}

void ConvertToBST(Node* n, Node** max)
{
    if (!n) return;

    // leaf node
    if (!n->left && !n->right)
    {
        *max = n;
        return;
    }

    Node *lmax = NULL, *rmax = NULL;
    ConvertToBST(n->left, &lmax);
    ConvertToBST(n->right, &rmax);

    bool swapped = false;
    if (lmax && n->value < lmax->value)
    {
        swap(n->value, lmax->value);
        swapped = true;
    }

    if (rmax && n->value > rmax->value)
    {
        swap(n->value, n->right->value);
        swapped = true;
    }

    *max = n;
    if (rmax && rmax->value > n->value) *max = rmax;

    // If either the left subtree or the right subtree has changed, convert the tree to BST again
    if (swapped) ConvertToBST(n, max);
}
Publicat 14/09/2013 la 07:56
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more