Hoe maak je een binaire boom te zetten in binaire zoekboom in-place, dat wil zeggen, we kunnen geen gebruik maken van extra ruimte

stemmen
12

Hoe maak je een binaire boom te zetten in binaire zoekboom in-place, dat wil zeggen, kunnen we geen extra ruimte niet gebruiken.

De vraag is gesteld op 05/04/2010 om 06:46
bron van user
In andere talen...                            


10 antwoorden

stemmen
0

Een binaire boom meestal is een binaire zoekboom, in welk geval geen conversie nodig is.

Misschien moet je de structuur van wat je converteren van verduidelijken. Is uw source tree onevenwichtig? Is het niet in opdracht van de toets die u wilt zoeken aan de hand? Hoe kwam u bij de bron boom?

antwoordde op 05/04/2010 om 07:00
bron van user

stemmen
0

Nou, als dit is een interview vraag, het eerste wat ik zou flappen uit (met nul werkelijke denken) is dit: herhaal het gehele binaire recursief en en vind de kleinste element. Neem het uit van de binaire boom. Nu, herhaal het proces waar u de gehele structuur niet herhalen en vind de kleinste element en voeg het als een ouder van de laatste gevonden (met de vorige element steeds linker kind van de nieuwe node) element. Herhaal dit zo vaak als nodig totdat de oorspronkelijke boom is leeg. Op het einde, heeft u nog met het slechtst mogelijke gesorteerde binaire boom - een gekoppelde lijst. Aanwijzer wijst naar het hoofdknooppunt, die het grootste element.

Dit is een verschrikkelijke algoritme all-around - O (n ^ 2) looptijd met het slechtst mogelijke binaire boom-uitgang, maar het is een fatsoenlijke uitgangspunt voor de proppen komen met iets beter en heeft het voordeel dat u de mogelijkheid om de code te schrijven voor het in ongeveer 20 lijnen op een bord.

antwoordde op 05/04/2010 om 07:50
bron van user

stemmen
10

Je hoeft niet veel te gaan geven, maar als de eis is wat ik denk dat het is, heb je een binaire boom al gemaakt en zitten in het geheugen, maar niet gesorteerd (de manier waarop u het wilt worden opgelost, in ieder geval).

Ik ga ervan uit dat de boom nodes eruit

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

Ik ben ook de veronderstelling dat je C kunt lezen

Terwijl we konden gewoon zitten afvragen waarom deze boom ooit is gemaakt zonder te zijn opgericht in gesorteerde volgorde die ons geen goed doet, dus zal ik het te negeren en zich alleen bezig met het sorteren het.

De eis dat er geen extra ruimte gebruikt oneven. Tijdelijk is er extra ruimte zal zijn, al was het maar op de stapel. Ik ga ervan uit dat het betekent dat bellen malloc of iets dergelijks en ook dat de resulterende boom heeft geen geheugen meer gebruiken dan de oorspronkelijke ongesorteerde boom.

De eerste en eenvoudigste oplossing is een preorder traversal van de ongesorteerde boom verwijderen elk knooppunt van de boom en doet een gesorteerde inbrengen in een nieuwe structuur doen. Dit is O (n + n log (n)), die O (n log (n)).

Als dit niet is wat ze willen en je gaat te hebben om rotaties en dat soort dingen te gebruiken ..... dat is verschrikkelijk!

Ik dacht dat je dit kon doen door het doen van een vreemde versie van een hoop soort, maar ik kwam in de problemen. Een ander ding dat voor de geest kwam, die verschrikkelijk traag zou zijn, zou aan een vreemde versie van bubble sort doen op de boom.

Voor dit elk knooppunt wordt vergeleken en eventueel verwisseld met elk van het directe kinderen (en dus ook met haar moedermaatschappij) totdat u de boom doorkruisen en geen benodigde swaps niet vinden. Het doen van een shaker sort (bubble sort dat gaat van links naar rechts en van rechts naar links) versie van deze zou het beste werken, en na de eerste pas zou je niet hoeft te doorkruisen naar beneden substructuren die niet buiten de orde zag er met betrekking tot het ouder .

Ik ben er zeker van dat ofwel deze algorthm up werd gedacht door iemand anders voor mij en heeft een coole naam die ik gewoon niet weten, of dat het fundamenteel fout op een manier die ik niet zien.

Coming up met de run-time berekeningen voor de tweede suggestie is een behoorlijk ingewikkeld. In eerste instantie dacht ik dat het gewoon O zou zijn (n ^ 2), zoals bel en shaker soorten, maar ik kan niet mezelf te overtuigen dat de sub-boom traversal vermijden niet genoeg om het een beetje beter dan O te maken zou kunnen winnen (n ^ 2). In wezen bel en shaker soorten krijgen deze optimalisatie ook, maar alleen aan de uiteinden waar de totale sortedness optreedt vroeg en je kunt omhakken van de grenzen. Met deze boom versie krijg je er gelegenheid om eventueel brokken te voorkomen dat in het midden van de set ook. Nou, zoals ik al zei, is het waarschijnlijk dodelijk gebrekkig.

antwoordde op 05/04/2010 om 08:09
bron van user

stemmen
-1

Doe inorder traversal van de binaire boom en het resultaat. sorteren het resultaat in acending bestelformulier de binaire zoekboom door het nemen van midden element van de gesorteerde lijst als root (dit kan gedaan met behulp van binary search). zodat we evenwichtige binaire zoekboom.

antwoordde op 15/12/2010 om 05:12
bron van user

stemmen
1

Heeft volgende algoritme om de oplossing te komen.

1) vindt de in orde opvolger zonder het gebruik van de ruimte.

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) doen om traversal zonder het gebruik van de ruimte.

a) Bepaal het eerste knooppunt van inorder traversal. Het moet de meeste kind van de boom links zo ja, of links van de eerste rechts kind zo ja, of naar rechts kind zelf. b) Gebruik bovenstaand algoritme voor het vinden van inoder opvolger eerste knooppunt. c) Herhaal stap 2 voor alle de geretourneerde opvolger.

Gebruik boven de 2-algoritme en doe het in orde traversal op binaire boom zonder het gebruik van extra ruimte. Vorm de binaire zoekboom bij het doen van traversal. Maar de complexiteit is O(N2)het slechtste geval.

antwoordde op 15/12/2010 om 05:35
bron van user

stemmen
-1

heap soort de boom .. nlogn complexiteit ..

antwoordde op 13/06/2011 om 20:23
bron van user

stemmen
2

Doe de postorder Traversal en vanaf dat het creëren van een binaire zoekboom.

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';
    }
}
antwoordde op 10/01/2012 om 05:27
bron van user

stemmen
14

Zet Binary Tree aan een dubbel verbonden lijst-kan inplace worden gedaan in O (n)
Dan soort gebruik samenvoegen soort, nlogn
terug te zetten in de lijst om een boom - O (n)

Simple nlogn oplossing.

antwoordde op 29/08/2012 om 15:37
bron van user

stemmen
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;
}
antwoordde op 24/12/2012 om 00:49
bron van user

stemmen
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);
}
antwoordde op 14/09/2013 om 07:56
bron van user

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