2016-11-25 6 views
-2

Я новичок. Я пытаюсь напечатать уровень дерева avl по уровню, и он должен быть справа налево. но результат слева направо. Надеюсь, вы сможете решить мою проблему. Вот кусок моего исходного кода:Печать AVL Уровень дерева по уровню (C++)

void printOrder(TreeNode *treePtr, int *row) { 
    if(treePtr != NULL){ 
     (*row)++; 
     printOrder(treePtr->rightPtr,row); 
     int i; 
     for(i=0;i<(*row);i--) 
      printf("\t"); 
     printf("%d\n", treePtr->data); 
     printOrder(treePtr->leftPtr,row); 
     (*row)--; 
    } 
} 

void printTree(TreeNode *treePtr) { 
    int row = 0; 
    printOrder(treePtr,&row); 
} 

Результат:

  80 
    70 
50 
    40 
      30 

Результат, который я хочу, должно быть так:

 30\ 
      40\ 
       50 
      70/ 
     80/ 

ответ

0

Вы могли бы сначала пройти через свое дерево (как вы уже это сделали) и добавить каждую запись в std::vector вместо ее печати напрямую, в результате чего будет сформирована последовательность элементов, таких как

{80,70,50,40,30} 

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

{30,40,50,70,80} 

Теперь распечатайте, что содержание в этой форме вы желаете, путем просто цикл над вектором.

Чтобы получить правильное намерение, вы можете хранить std::pair элементов в векторе, содержащих уровень намерения в качестве второго элемента, например.

{{80,0},{70,1},{50,2},{40,1},{30,0}} 

Для печатного намерения вы вычитаете число из максимального уровня намерения.

Или, в качестве альтернативы, траверса вашего дерева в левом среднем правом порядка перестановки строк

printOrder(treePtr->rightPtr,row); 

и

printOrder(treePtr->leftPtr,row); 

и распечатать его по своему желанию.

+0

как, если я хочу распечатать его напрямую? –

+0

@Michael Loew Как я предложил в своем последнем предложении: Поверните дерево в порядке слева-середина, заменив следующие строки '' printOrder (treePtr-> rightPtr, row); '' и ''printOrder (treePtr-> leftPtr , строка); ' ' – cwschmidt