2016-03-29 5 views
-3

Ich habe versucht, die folgende Methode rekursiv zu schreiben, um einen Knoten in einen Binärbaum einzufügen. Die Strategie bestand darin, den Knoten im Grunde in jeden linken oder rechten NULL-Zeiger einzufügen.Element rekursiv in BinaryTree einfügen

typedef struct BinaryTreeNode { 
int data; 
BinaryTreeNode * left; 
BinaryTreeNode * right; 
} BinaryTreeNode; 

void InsertElementInBinaryTree(BinaryTreeNode *root, BinaryTreeNode *element) { 
    if(root) { 
     if(root -> left == NULL) root -> left = element; 
     else if(root -> right == NULL) root -> right = element; 
     InsertElementInBinaryTree(root -> left, element); 
     InsertElementInBinaryTree(root -> right, element); 
    } 
} 

Die Methode aufgerufen wird, wie in der Hauptfunktion

InsertElementInBinaryTree(&root , new BinaryTreeNode{8, NULL,NULL});

folgt

Das Problem ist, dass dieser Aufruf immer einen Segmentation Fault Fehler zurückgibt, damit ich der Fehler in der Rekursion glauben?

+0

Wenn Sie dynamische Strukturen wie Linked-Lists und Trees verwenden, müssen Sie ** malloc() ** verwenden, um Speicher auf dem Heap zu reservieren, bevor Sie Daten speichern können. Sie müssen auch ** frei() **, bevor die Anwendung beendet wird, sonst wiederholt die Verwendung Ihrer Anwendung alle Heapspeicher unbrauchbar machen. –

Antwort

0

Sie verpassen einige Bedingungen:

 if (root->data > element->data) { 
     if (root->left == NULL) { 
      root->left = element; 
     } else { 
      InsertElementInBinaryTree(root->left, element); 
     } 
    } else { 
     if (root->right == NULL) { 
      root->right = element; 
     } else { 
     InsertElementInBinaryTree(root->right, element); 
      } 
    } 
0

Wenn Sie Binärbaum versuchen dann alle für alle aktuellen Knoten implementieren die Knoten von der linken Unterbaum sollte niedriger data haben als die data in aktuellen Knoten und alle Die data aus dem rechten Teilbaum sollte größer sein.

void InsertElementInBinaryTree(BinaryTreeNode *&root, BinaryTreeNode *element) { 
    if(root == NULL) { root = element; return;} 
    if(root -> data > element -> data) 
     InsertElementInBinaryTree(root->left, element); 
    else 
     InsertElementInBinaryTree(root->right, element); 
} 

So tatsächlich data Werte definieren die Position element bei eingefügt wird. Auch ich übergebe BinaryTreeNode *&root als Referenz, um den root Zeiger veränderbar zu sein.

Verbrauch:

// declare root 
BinaryTreeNode* root; 
// insertion, no & operator before root 
InsertElementInBinaryTree(root, new BinaryTreeNode{8, NULL,NULL}); 
0

Die Funktion kann sehen die folgende Art und Weise

void InsertElementInBinaryTree(BinaryTreeNode * &root, int data) 
{ 
    if (root == nullptr) 
    { 
     root = new BinaryTreeNode { data, nullptr, nullptr }; 
    } 
    else if (data < root->data) 
    { 
     InsertElementInBinaryTree(root->left, data); 
    } 
    else 
    { 
     InsertElementInBinaryTree(root->right, data); 
    } 
} 

und rief wie

InsertElementInBinaryTree(root , 8); 

und das Objekt root sollte zunächst wie

01 definiert werden,