Мне нужно построить дерево с произвольным числом «сыновей» в каждом узле (динамическая таблица с указателями на «сыновья» узла):
class node{
public
string data;
int number_of_sons;
struct node *father, **sons; // **sons is table of pointers to the "sons" of the node;
node(string s, int n) : data(s), number_of_sons(n){
}//constructor
};
и список класса:
class tree{
public:
node *root;
tree() : root(NULL){
}
};
Я создаю дерево и узлы дерева следующим образом:
tree t1 = new tree();
node n1 = new node("example1", 1);
node n2 = new node("example2", 2);
node n3 = new node("example3", 1);
node n4 = new node("example4", 3);
И я пытаюсь вставить их «вручную» в дерево, и это не работает:
n1->father = NULL;
t1->root = n1;
//adding the second object to the tree:
n2->father = root;
t1->root->sons[0] = n2;
Добавление «n1» в пустое дерево работает, но вторые операции некорректны. Может кто-нибудь дать мне совет, как обращаться с таким деревом? Как добавить новый узел в корень?
Вы должны выделить место для сыновей. Вы можете использовать вектор для сыновей или просто сохранить в массив, как:
в конструкторе:
sons = new node[SIZE];
for(int i=0;i<SIZE;i++)
sons[i]= new node();
тогда просто код:
n1->father = NULL;
t1->root = n1;
//adding the second object to the tree:
n2->father = root;
t1->root->sons[0] = n2;
Я думаю n2 -> father = root
неправильно. корень является членом данных tree
, вы можете отослать это использовать t1 -> root
, И если вы хотите определить дерево, вам просто нужно определить класс Node следующим образом:
class Node
{
string data_;
std::vector<Node> children_;
public:
Node(string);
}
//
Node* root = new Node("root");
Node node = Node("child");
root -> children.insert(node);