2016-07-22 3 views
1

Проблема

У меня есть некоторые сомнения с моим методом вставки в C++, это вызывает переполнение стека.Метод вставки двоичного дерева вызывает переполнение стека

Собран с г ++ на Windows,

г ++ -Wall -O2 Tree.cpp -o Дерево

Выход

0 [неизвестно (0x2B70)] Дерево 10496 cygwin_exception :: open_stackdumpfile: сбросами стек трассировки в Tree.exe.stackdump

код
# 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

выглядит бесконечной рекурсии мне – Jeremy

+0

Это потому, что 'вернуть node' должны быть добавлены к' if' для базового случая. – dasblinkenlight

+0

Да, это была бесконечная рекурсия хехе, спасибо :) – Bit89

ответ

2

Y ou должны остановить рекурсию, когда она достигнет NULL.

Попробуйте это:

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

Вау, теперь это работает, я новичок в рекурсии :), Спасибо за ваше время. – 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

Спасибо, что объяснили, что рекурсия немного запутанна в начале, это условие применяется во всех рекурсивных методах? Например, подсчитайте количество узлов. – Bit89

Смежные вопросы