2015-12-16 3 views
0

Я хочу реализовать игровое дерево, которое может иметь любое количество узлов на каждом уровне, в основном я работаю над AI для шашек, и я хочу реализовать игровое дерево, которое будет использоваться в минимаксном алгоритме .Это мой код, и я работал над первым случаем вставки, т. Е. Когда Tree пуст .... но когда я пытаюсь получить доступ к данным у root, моя программа сработает! любая помощь?? :/Реализация игрового дерева для шашек

#include <iostream> 
using namespace std; 

struct Node { 
    Node **child; 
    int data; 
}; 

class Tree { 
public: 
    Node *root; 
    Tree() { 
     root = NULL; 
    } 

private: 
    void add(Node *r, int data, int size) { 
     if (r == NULL) { 
      Node *newnode = new Node; 
      newnode->child = new Node*[size]; 
      for (int i = 0; i < size; ++i) { 
       newnode->child[i] = new Node; 
       newnode->child[i]->child = 0; 
      } 
      newnode->data = data; 
      r = newnode; 
     } 
    } 

public: 
    void add(int data, int size) { 
     add(root, data, size); 
    } 
}; 

int main() { 

    Tree t; 
    t.add(5, 20); 
    cout << t.root->data << endl; 
    return 0; 
} 
+1

Ваш отладчик может помочь. –

+0

Я не уклоняюсь от структуры ваших методов добавления. Зачем пропускать «root» внутри них, когда он является членом var? –

+0

Рекомендовать переосмыслить, как вы это делаете, потому что вы кодируете свой путь в город ошибок. Например, сколько детей находится в заданном «узле»? Эта часть информации была отброшена. Вы можете добавить только к 'root'. «Узел» не имеет надлежащего права собственности на ребенка и рассчитывает на «Дерево» для тяжелого подъема. Это означает, что «Дерево» должно знать все о себе и обо всех «узлах», усложняя «Дерево» и при усложнении «Узла». – user4581301

ответ

0

Проблема заключается в вашей частной функции добавления, которую вы передаете r по значению. Поэтому, когда вы устанавливаете r = newnode, вы фактически устанавливаете адрес для локальной переменной указателя, и это не влияет на root. Вот обходной путь:

class Tree { 
public: 
    Node *root; 
    Tree() { 
     root = NULL; 
    } 

private: 
    void add(Node **r, int data, int size) { 
     if (*r == NULL) { 
      Node *newnode = new Node; 
      newnode->child = new Node*[size]; 
      for (int i = 0; i < size; ++i) { 
       newnode->child[i] = new Node; 
       newnode->child[i]->child = 0; 
      } 
      newnode->data = data; 
      *r = newnode; 
     } 
    } 

public: 
    void add(int data, int size) { 
     add(&root, data, size); 
    } 
}; 
+0

Спасибо! Это решило проблему! –

+0

Работает, но рекомендуется использовать ссылку не указатель 'void add (Node * & r, int data, int size) {' – user4581301

0

Что вы делаете неправильно это:

r = newnode; 

г является локальной переменной вы должны сделать

root = newnode; 

И ваш код будет работать.

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

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