C ++ двоичный объект дерева, метод "вставки" с 1 параметром - PullRequest
0 голосов
/ 06 декабря 2018

Я изучаю двоичные деревья и хочу реализовать с помощью ООП, где у меня есть struct Node, и создать объект BST.Я пытаюсь создать функцию вставки с этим подходом и сталкиваюсь с проблемой, когда я не могу рекурсивно пройти по дереву, чтобы добавить новый узел - то есть, если я не перегружаю метод, по сути копируя его, чтобы вызвать новыйметод с указателем на left или right.Трудно объяснить, но сейчас у меня есть два метода, и я не уверен, что я упускаю что-то очевидное, чтобы просто иметь 1 метод с 1 параметром int data, или этот подход просто не верен.Я чувствую, что здесь есть чему поучиться.Большое спасибо.

#include <iostream>

struct Node
{
    Node *right;
    Node *left;
    int data;
};

class BST
{
public:
    Node* root;

public:
    BST()
    :root(NULL)
    {
    }

    //inserts node taking parameter data
    Node* insertNode(int data)
    {
        //if tree is empty, create root
        if (root == NULL)
        {
            root = newNode(data);
        }
        //if data is smaller than or equal to root, insert left
        else if (data <= root->data)
        {
            root->left = insertNode(root->left, data);
        }
        //data is larger than root, insert right
        else
        {
            root->right = insertNode(root->right, data);
        }
        return root;
    }      

    //inserts new node
    Node* insertNode(Node *root, int data)
    {
        //if tree is empty, create root
        if (root == NULL)
        {
            root = newNode(data);
        }
        //if data is smaller than or equal to root, insert left
        else if (data <= root->data)
        {
            root->left = insertNode(root->left, data);
        }
        //data is larger than root, insert right
        else
        {
            root->right = insertNode(root->right, data);
        }
        return root;
    }

    Node* newNode(int data)
    {
        Node *temp = new Node;
        temp->data = data;
        temp->left = NULL;
        temp->right = NULL;
        return temp;
    }

};

int main() {

    BST bst1;
    bst1.insertNode(30);
    bst1.insertNode(15);

    return 0;
}

1 Ответ

0 голосов
/ 06 декабря 2018

Вы можете сохранить избыточность, перенаправив один вызов на другой:

Node* insertNode(int data)
{
    return insertNode(root, data);
}

Обратите внимание, что наличие идентичных имен для вашего члена класса (Node* root) и локальной переменной в Node* insertNode(Node *root, int data) является ошибкой-прон.

Также, пожалуйста, не забудьте delete, что вы new.

...