Вставка бинарного дерева поиска C с корнем на текущем узле

#c #recursion #binary-tree #insertion

#c #рекурсия #двоичное дерево #Вставка

Вопрос:

Мне нужно добавить элемент в двоичное дерево, учитывая только добавляемый элемент.

Вот код, который я даю:

 void BinaryTree::add(Data * data) {
    if (root == NULL) {
        root = new BinaryTreeNode(data);
    }
    else {
        root->add(data);
    }
}
  

где root — частная переменная a BinaryTree , определенная как a BinaryTreeNode .

Мне нужно реализовать метод:

 void BinaryTreeNode::add(Data * data);
  

где a BinaryTreeNode -:

 class BinaryTreeNode {
public:
    Data * nodeData;
    BinaryTreeNode * left;
    BinaryTreeNode * right;

    /**
     * Constructor
     */
    BinaryTreeNode(
        Data * data,
        BinaryTreeNode * left = NULL,
        BinaryTreeNode *right = NULL
    )
      : nodeData(data), left(left), right(right)
    { }

    // ...
  

Я хочу сделать это рекурсивно, но я не уверен, как, когда вы передаете только добавляемые данные.

Моя идея, которая не работает:

 void BinaryTreeNode::add(Data * newData) {
    BinaryTreeNode * temp = this;
    if (temp == NULL) {
        temp->nodeData = newData;
    } else {
        if (newData->compareTo(nodeData) < 0) {
            temp->left->add(newData);
        } else {
            temp->right->add(newData);
        }
    }
}
  

Комментарии:

1. Нет веской причины редактировать код из вашего вопроса.

Ответ №1:

Вы устанавливаете для этого значение temp, а затем сравниваете его с NULL. это никогда не должно быть NULL. Вам нужно проверить, являются ли значения left и right равными NULL.

Комментарии:

1. спасибо, это на самом деле то, что я только что понял, и я запустил его.

Ответ №2:

Ну, двоичное дерево, по крайней мере, насколько я знаю, как реализовать, включает в себя что-то вроде следующего с двумя объектами, один из которых содержит объект treenode, а другой действует как интерфейс для всего дерева.

  class cBinaryTree {

 public:
 bool insert(int inData);
 //Other operations

 private:
 cBinaryTreeNode* root;
 bool leftInsertion;
 cBinaryTreeNode* getRoot() { return root; }
  

Поскольку вы сравниваете фактическое значение входных данных и размещаете их соответствующим образом, это квалифицируется как двоичное дерево поиска. Тогда функция вставки может быть записана как

 bool cBinaryTree::insert(int inData) {

//handle case if its first node.
cBinaryTreeNode *Parent = getInsertionNodePosition(getRoot(), inData);
cBinaryTreeNode *newNode = createNewNode(inData);

if(leftInsertion) //insert into left. add return statement
    Parent->setLeftChild() = newNode;
else //insert into right 
}
  

Функция рекурсивного поиска будет выглядеть примерно так

 cBinaryTreeNode* getInsertionNodePosition(cBinaryTreeNode* node,int inData) {

//Check left subtree and proceed from there.
if(inData < node->getData()) {
    if(node->getLeftChild() == NULL)  {             
        leftInsertion = true;
        return node;
    }
    else {
        node = node->getLeftChild();
        return getInsertionNodePosition(node, inData);
    }
}
    //Similarly Check right subtree.
  

Надеюсь, это поможет.