2016-07-22 8 views
1

Das Problem

ich einige Zweifel mit meiner Methode zum Einfügen in C++ mit, es verursacht einen Stapelüberlauf.Binary Tree Einfügemethode verursacht Stapelüberlauf

Zusammengestellt mit g ++ auf Windows

g ++ -Wall -O2 Tree.cpp -o Baum

Ausgang

0 [unknown (0x2B70)] Baum 10496 cygwin_exception :: open_stackdumpfile: Versenkung Stack-Trace Tree.exe.stackdump

-Code

# include <iostream> 

using namespace std; 

struct Node{ 

    int val; 
    Node *left, *right; 

}; 

Node* Insert(Node *node, int val) 
{ 

    if(node == NULL) 
    { 
     node = new Node; 
     node->val = val; 
     node->right = node->left = NULL; 
    } 

if(node->val > val) 
    node->left = Insert(node->left, val); 
else 
    node->right = Insert(node->right, val); 

return node; 

} 

int main() 
{ 

Node *root = NULL; // New tree 

root = Insert(root, 5); 
root = Insert(root, 19); 
root = Insert(root, 1); 
root = Insert(root, 32); 
return 0; 
} 
+0

sieht aus wie eine unendliche Rekursion mir – Jeremy

+0

Dies liegt daran, 'Rückkehr node' zum' if' für den Basisfall hinzugefügt werden soll. – dasblinkenlight

+0

Ja es war eine unendliche Rekursion hehe, danke :) – Bit89

Antwort

2

Y Sie müssen die Rekursion stoppen, wenn sie NULL erreicht hat.

Try this:

Node* Insert(Node *node, int val) 
{ 

    if(node == NULL) 
    { 
     node = new Node; 
     node->val = val; 
     node->right = node->left = NULL; 
    } 

    else if(node->val > val) // add "else" here 
     node->left = Insert(node->left, val); 
    else 
     node->right = Insert(node->right, val); 

    return node; 

} 
+0

Wow, jetzt funktioniert es, ich bin neu in Rekursion :), Danke für deine Zeit. – Bit89

0
The problem in your function is, you are trying to access null memory. 
Please check my comments here 

/* You are checking for node == null, which is correct. */ 
if(node == NULL) 
    { 
     node = new Node; 
     node->val = val; 
     node->right = node->left = NULL; 
    } 


    /* Consider what will happen when node is null, you are still trying to access null memory. You need to put else if here to avoid control to fall into this condition if node is null. */ 
    if(node->val > val) // add "else" here 
     node->left = Insert(node->left, val); 
    else 
     node->right = Insert(node->right, val); 
+0

Danke für die Erklärung, Rekursion ist am Anfang etwas verwirrend, diese Bedingung gilt für alle rekursiven Methoden? Zählen Sie beispielsweise die Anzahl der Knoten. – Bit89