root-> left = new Node (val);
root-> right = new Node (val);
Кажется, что вы создаете новый узел и даете ему только "val", без возраста, имени и т. Д., Поэтому он имеет только значение.
edit: я никогда не использовал "Template" раньше, поэтому мне понадобилось время, чтобы разобраться с ним. В любом случае ...
Решение:
Когда вы вставляете узел, вам нужно скопировать всю информацию, а не только «значение», иначе вы получите только «значение».
void addHelper(Node<T> *root, Node<T>* n) {
if (root->value > n->value) {
if (!root->left) {
root->left = new Node<T>(n->value,n->age,n->name,NULL,NULL);
}
else {
addHelper(root->left, n);
}
}
else {
if (!root->right) {
root->right = new Node<T>(n->value,n->age,n->name,NULL,NULL);
}
else {
addHelper(root->right, n);
}
}
}
Также в «insert»:
void insert(Node<T>* n) {
if (root) {
this->addHelper(root, n);
}
else {
root = new Node<T>(n->value,n->age,n->name,NULL,NULL);
}
}
Несколько других вещей, которые вы можете попробовать и увидеть разницу:
Я бы инициализировал * root как NULL, в противном случае это может быть какой-то случайный материал, и иногда я получаю ошибку seg из-за этого.
class BST {
private:
Node<T> *root=NULL;
Если узел, который вы собираетесь вставить, имеет то же самое «значение» с уже существующим узлом, что вы делаете? Ваша программа просто добавит его справа. Я не знаю, хотите ли вы этого, но именно так оно и будет.
Я проверил с этим, и это сработало. Надеюсь, это сработает и для вас.
int main(){
BST<int> tree;
Node<int> node1(1,10,"test1",NULL,NULL);
Node<int> node2(5,50,"test2",NULL,NULL);
Node<int> node3(3,30,"test3",NULL,NULL);
Node<int> node4(3,30,"test4",NULL,NULL);
Node<int> node5(3,30,"test5",NULL,NULL);
Node<int> node6(8,80,"test5",NULL,NULL);
tree.insert(&node1);
tree.insert(&node2);
tree.insert(&node3);
tree.insert(&node4);
tree.insert(&node5);
tree.insert(&node6);
tree.print();
cout<<endl;
return 0;
}
выход:
1 10 test1 3 30 test3 3 30 test4 3 30 test5 5 50 test2 8 80 test5