2016-03-30 7 views
0

Ich versuche eine Funktion zu schreiben, die ein Element in einen binären Baum mit Level-Reihenfolge-Traversal einfügen wird. Das Problem, auf das ich mit meinem Code stoße, ist, dass wenn ich den Level-Order-Traversal nach dem Einfügen eines neuen Knotens in den Baum drucke, er die Elemente in einer Endlosschleife ausdruckt. Die Nummern 1 2 3 4 5 6 7 8 rasen über das Terminal. Ich würde mich über Hinweise und Ratschläge zur Lösung dieser Situation freuen.Einfügen eines Knotens in einen binären Baum mit Level-Reihenfolge-Traversal

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

Dies ist traversal Ebene um die Elemente zu drucken:

void LevelOrder(BinaryTreeNode *root) { 
BinaryTreeNode *temp; 
std::queue<BinaryTreeNode*> Q {}; 

if(!root) return; 

Q.push(root); 

while(!Q.empty()) { 
    temp = Q.front(); 
    Q.pop(); 

    //process current node 
    printf("%d ", temp -> data); 

    if(temp -> left) Q.push(temp -> left); 
    if(temp -> right) Q.push(temp -> right); 
} 
} 

Dies ist, wo I ein Element in den Baum eingefügt durch

Ebene um traversal Technik modifizierende
void insertElementInBinaryTree(BinaryTreeNode *root, int element) { 
BinaryTreeNode new_node = {element, NULL, NULL}; 

BinaryTreeNode *temp; 
std::queue<BinaryTreeNode*> Q {}; 

if(!root) { 
    root = &new_node; 
    return; 
} 

Q.push(root); 

while(!Q.empty()) { 
    temp = Q.front(); 
    Q.pop(); 

    //process current node 
    if(temp -> left) Q.push(temp -> left); 
    else { 
     temp -> left = &new_node; 
     Q.pop(); 
     return; 
    } 

    if(temp -> right) Q.push(temp -> right); 
    else { 
     temp -> right = &new_node; 
     Q.pop(); 
     return; 
    } 
} 
} 

MAIN

int main() { 
BinaryTreeNode one = {1, NULL, NULL}; // root of the binary tree 
BinaryTreeNode two = {2, NULL, NULL}; 
BinaryTreeNode three = {3, NULL, NULL}; 
BinaryTreeNode four = {4, NULL, NULL}; 
BinaryTreeNode five = {5, NULL, NULL}; 
BinaryTreeNode six = {6, NULL, NULL}; 
BinaryTreeNode seven = {7, NULL, NULL}; 

one.left = &two; 
one.right = &three; 

two.left = &four; 
two.right = &five; 

three.left = &six; 
three.right = &seven; 

insertElementInBinaryTree(&one, 8); 

LevelOrder(&one); 
printf("\n"); 

return 0; 
} 

Antwort

1

Auf dieser Linie

temp -> left = &new_node; 

Sie machen temp->left Punkt auf eine lokale Variable, die nicht mehr nach der Funktion zurückkehrt existieren. Jeder Versuch, darauf zuzugreifen, ist ein nicht definiertes Verhalten.

+0

Also sollte ich den hinzuzufügenden Knoten senden, anstatt den Knoten lokal zu erstellen? –

+1

@MutingAlgorithm: Das wäre vernünftig. –

+0

Nur neugierig, wie ich es schaffen könnte, indem ich nur das eigentliche Element (die Nummer) einsende, anstatt den Knoten in main zu erstellen. –

Verwandte Themen