Hoe kan ik de boom te creëren?

stemmen
1

Ik ben op zoek naar een BST te maken en de noodzaak om het af te drukken inorder, postorder, en preorder.

Het ding ben niet zeker over is hoe deze boom in mijn creëren main()functie.

struct Tree_Node
{
    Tree_Node *right;
    Tree_Node *left;
    int info;
};

class bTree
{
private:
    Tree_Node *root;
public:
    bTree();
    void bTree::Insert(Tree_Node*& tree, int item);
    void bTree::preorderPrint(Tree_Node *root);
};

bTree::bTree()
{
    root = NULL;
}


void bTree::Insert(Tree_Node*& tree, int item)
{
  if (tree == NULL)
  {
    tree = new Tree_Node;
    tree->right = NULL;
    tree->left = NULL;
    tree->info = item;
  }
  else if (item < tree->info)
    Insert(tree->left, item);    
  else
    Insert(tree->right, item);   
} 

void bTree::preorderPrint(Tree_Node *root)
{
    if ( root != NULL ) 
    {
        cout << root->info <<  ;
        preorderPrint( root->left );   
        preorderPrint( root->right );   
    }
}

void main()
{
// This is where I need help at
// I'm not sure how to insert a new node

    bTree Test;
    Test.Insert(    
}
De vraag is gesteld op 08/12/2009 om 07:27
bron van user
In andere talen...                            


2 antwoorden

stemmen
2

Door de aanblik van de dingen, kun je gewoon schrijven

Test.Insert(Test.root, 3); // Insert 3
Test.Insert(Test.root, 4); // Insert 4

en dat zou moeten werken. Natuurlijk, je moet hier root openbaar te maken.

Echter, dit is een beetje onhandig, omdat de eerste parameter altijd bTree.root zal zijn - en je niet nodig hebt om die openbaar te maken. Vergeet niet dat de gebruiker van uw gegevens type (u of iemand anders) moet niet zorgen te maken over internals zoals knooppunten - ze alleen de zorg over hun gegevens. In plaats daarvan zou ik aanraden het maken van een convenience Insertmethode die alleen nodig heeft om een integer (geen boom knooppunt) te nemen - dit heet Overbelasting.

void bTree::Insert(int item)
{
    Insert(root, item);
}

// Keep the other insert method, but make it private.

Dan kun je gewoon schrijven:

Test.Insert(3);
Test.Insert(4);
antwoordde op 08/12/2009 om 07:37
bron van user

stemmen
1
void bTree::Insert(int item)
{
  Tree_Node * node = new Tree_Node;
  node->left = NULL;
  node->right = NULL;
  node->info = item;
  if (root == NULL)
  {
    root = node;
    return;
  }
  Tree_Node * t = root;
  Tree_Node * p = root;
  while(1)
  {
    if (item < t->info)
    {
       t = t->left;
       if(t == NULL)
       {
          p->left = node;
          return;
       }
    }
    else if(item > t->info)
    {
       t = t->right;
       if(t == NULL)
       {
          p->right = node;
          return;
       }
    }
    else //item already exists in the tree
       return;
    p = t;
  }

} 

//now you can insert nodes like
Test.Insert(5);
Test.Insert(6);
antwoordde op 08/12/2009 om 07:46
bron van user

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