2016-03-29 3 views
1

Я пытаюсь напечатать мой ЛУЧШИЙ таким образом, что он печатает как это:Печать бинарное дерево поиска заказовМои с отступа

 50, 11 
       45,72 
40,12 
       30,16 
     20,16 
       10,54 

Мой код не делает это, как я хотел бы, но здесь это:

void AVLTree::printHelp(Node * node) 
    { 
     if (node == 0) { 
      return; 
     } 
     printHelp(node->left); 

     indent = ""; 
     for (size_t i = 1; i < calculateHeight(node); i++) 
     { 
      indent += "  "; 
     } 

     cout << '\n' << indent << node->value; 
     printHelp(node->right); 

    } 
+0

Каковы значения всех переменных? –

+0

indent - это просто пустая строка, которую я использовал для добавления пространств, чтобы показать уровни узлов. – RookieProgrammer

+0

Что осталось, значение и узел? Кроме того, что делает printHelp()? –

ответ

1

Есть по крайней мере две проблемы с вашим кодом:

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

  2. Пересчитав высоту узла для отступов, вы возводите в квадрат сложности этой операции.

попробовать что-то вроде этого:

#include <string> 

void AVLTree::printHelp(const Node *const node, size_t height) 
{ 
    if (node == 0) { 
     return; 
    } 

    printHelp(node->right, height + 1); 
    cout << string(height, ' ') << node->value << endl; 
    printHelp(node->left, height + 1); 
} 

Зов это с

printHelp(root, 0); 
+0

Спасибо за ответ! Но вывод теперь отображается как куча ящиков с вопросительными знаками в них, за которыми следует значение узла. – RookieProgrammer

+0

@RookieProgrammer Правда, я перепутал порядок аргументов с 'string'. Попробуйте исправленную версию. –

+0

Теперь он показывает 50 в качестве корневого узла, затем 30 на следующем уровне, затем 40 и 20, а затем 45 и 10. Я начинаю сомневаться в моей функции вставки. – RookieProgrammer