Попытка реализовать find в дереве avl

Я использую этот код https://rosettacode.org/wiki/AVL_tree#C.2B.2B в качестве основы для AVL-дерева. По умолчанию в примере используются целые числа, однако мне нужно хранить строки. Поэтому я изменил код для отладки, в основном сделав корневой каталог общедоступным и пытаясь распечатать значения.

22 /* AVL tree */
 23 template <class T>
 24 class AVLtree {
 25         public:
 26                 AVLtree(void);
 27                 ~AVLtree(void);
 28                 bool insert(T key);
 29                 void deleteKey(const T key);
 30                 void printBalance();
 31                 AVLnode<T> *root;
 32 
 33         private:
 34 
 35                 AVLnode<T>* rotateLeft          ( AVLnode<T> *a );
 36                 AVLnode<T>* rotateRight         ( AVLnode<T> *a );
 37                 AVLnode<T>* rotateLeftThenRight ( AVLnode<T> *n );
 38                 AVLnode<T>* rotateRightThenLeft ( AVLnode<T> *n );
 39                 void rebalance                  ( AVLnode<T> *n );
 40                 int height                      ( AVLnode<T> *n );
 41                 void setBalance                 ( AVLnode<T> *n );
 42                 void printBalance               ( AVLnode<T> *n );
 43                 void clearNode                  ( AVLnode<T> *n );
 44 };
..................................
247 int main(void)
248 {
249         AVLtree<std::string> t;
250 
251         std::cout << "Inserting integer values 1 to 10" << std::endl;
252         for (int i = 1; i <= 10; ++i)
253                 t.insert(i+" ");
254 
255         std::cout << "Printing balance: ";
256         t.printBalance();
257         std::cout << t.root->key + "\n";
258         std::cout << t.root->left->key + "\n";
259         std::cout << t.root->left->right->key + "\n";
260         std::cout << t.root->key;
261 
262 }

однако проблема в том, что распечатанный результат

Inserting integer values 1 to 10
Printing balance: 1 0 -1 0 0 1 0 0 1 0 
ing balance: 
Printing balance: 
g balance: 
ing balance: 

И я не знаю почему.


person dlrdlrdlr    schedule 19.04.2016    source источник


Ответы (1)


Я думаю, вы вставляете ненужные строки в свою структуру данных в следующих строках:

for (int i = 1; i <= 10; ++i)
    t.insert(i+" ");

Тип " " - const char *, и когда вы добавляете к нему целое число, вы получаете еще const char *, который смещен относительно исходного указателя. Поскольку строка " " в вашей программе была сохранена прямо перед строкой "Printing balance:", вы закончили создание указателей на различные позиции внутри строки "Printing balance:" при выполнении этого кода.

Чтобы правильно преобразовать числа в строки в C ++, вы можете использовать std :: to_string.

person David Grayson    schedule 19.04.2016
comment
Спасибо, я получал ошибку при использовании to_string, но решил сосредоточиться на ее исправлении, а не на ее устранении. - person dlrdlrdlr; 19.04.2016