2016-03-30 2 views
0

Я пытаюсь написать функцию, которая будет вставлять элемент в двоичное дерево, используя обход уровня. Проблема, с которой я сталкиваюсь с моим кодом, заключается в том, что когда я отправляюсь на печать обхода порядка уровня после вставки нового узла в дерево, он печатает элементы в бесконечном цикле. Цифры 1 2 3 4 5 6 7 8 продолжают участвовать в гонках через терминал. Я был бы признателен за любые рекомендации и рекомендации относительно того, как исправить эту ситуацию.Вставка узла в двоичное дерево с использованием обхода порядка порядка

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

Это порядок уровень обхода для печати элементы:

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); 
} 
} 

Это где я вставить элемент в дерево путем изменения порядка уровня техники обхода

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; 
} 

ответ

1

На этой линии

temp -> left = &new_node; 

Вы делаете temp->left точку локальной переменной, которая больше не будет существовать после того, как функция возвращает. Любая попытка доступа к нему - это неопределенное поведение.

+0

Так что я должен отправлять в узел, который нужно добавить вместо создания узла локально? –

+1

@MutatingAlgorithm: Это было бы разумно. –

+0

Просто любопытно, как я мог заставить его работать, просто отправив фактический элемент (число) вместо создания узла в главном. –

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