Вставка элементов в BST - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь вставить элементы в BST и не получаю правильных результатов. Вместо того, чтобы распечатывать все элементы массива, я печатаю 1,11,14 элементов вместо целых элементов массива.

int arr[10] = { 11, 2, 4, 23, 1, 98, 88, 65, 33, 14 };
void insertNodeinBST(int data,node **root){

    node *new_n = (node*)malloc(sizeof(node));
    new_n->leftChild = new_n->rightChild = NULL;
    new_n->data = data;
      //check if root is null
    if (*root == NULL) {
        *root = new_n;   
    }
    else if (data < (*root)->data){
        //if data is less than current root's data add it to left child
        insertNodeinBST(data, &(*root)->leftChild);
        (*root)->leftChild = new_n;
    }
    else {
      //if data is more than current root's data add it to right child
        insertNodeinBST(data, &(*root)->rightChild);   
        (*root)->rightChild = new_n;
    }

}

//print BST 
void printInorder(node *root){

        if (root == NULL)
            return;

        /* first recur on left child */
        printInorder(root->leftChild);

        /* then print the data of node */
        printf("%d ", root->data);

        /* now recur on right child */
        printInorder(root->rightChild);

}

int _tmain(int argc, _TCHAR* argv[])
{

    int i = 0;
    node *root = NULL;
    for (i = 0; i < 10; i++){
        //inserting nodes
        insertNodeinBST(arr[i], &root);
    }
    printInorder(root);
    return 0;
}

Пожалуйста, дайте мне знать, что мне здесь не хватает.

1 Ответ

0 голосов
/ 16 мая 2018

У вас почти это было, просто пара вещей в insertNodeinBST():

Вы должны создавать новый узел, только когда root равен NULL, в противном случае вы продолжаете создавать новый узел каждый раз, когда выпосетите новый узел, ища место для вставки:

//check if root is null
if (*root == NULL) {
    node *new_n = (node*)malloc(sizeof(node));
    new_n->leftChild = new_n->rightChild = NULL;
    new_n->data = data;

    *root = new_n;
}

Приведенный выше код заботится о вставке нового узла, поэтому вам не нужны другие назначения, измените:

} else if (data < (*root)->data) {
    //if data is less than current root's data add it to left child
    insertNodeinBST(data, &(*root)->leftChild);
    (*root)->leftChild = new_n;
} else {
    //if data is more than current root's data add it to right child
    insertNodeinBST(data, &(*root)->rightChild);
    (*root)->rightChild = new_n;
}

до

} else if (data < (*root)->data) {
    //if data is less than current root's data add it to left child
    insertNodeinBST(data, &(*root)->leftChild);
} else {
    //if data is more than current root's data add it to right child
    insertNodeinBST(data, &(*root)->rightChild);
}

рекурсивный вызов установит указатель на новый узел, когда он достигнет правильного пустого узла.

...