Печать ключей B + Tree - PullRequest
       5

Печать ключей B + Tree

0 голосов
/ 20 июня 2011

Я бы хотел напечатать ключи дерева B + так, как оно выглядит в C. Например, в следующей форме

                 | 12 |20| 30|

         5|9|11|     |12|17|_|    |20|27|26|   |30|-|-|

Вышеуказанное дерево имеет порядок (разветвление) 4. Верхний узелузел дерева.Любой алгоритм или псевдокод будет высоко оценен.

РЕДАКТИРОВАТЬ

структура данных я реализую дерево. И код для реализации дерева.Когда я пытаюсь распечатать дерево, я получаю ошибку сегментации в строке Enqueue(tempNode->pointers[i]); модуля printBplus(root)

            typedef struct bplus{
                 void ** pointers;         /*These are the array of pointers that                each tree node contains*/
                 int * keys;               /*These are the array of keys in each tree node*/
                 struct bplus * parent;    /*This the pointer to the parent tree node */
                 bool is_Leaf;             /*To check if the node is leaf*/
                 int num_Keys;             /*This keeps track the number of active keys in the node */
                 struct bplus * next ;      /*This is the pointer to next level  tree,used for queuing and dequeing node*/ 
               } *bplus, bplus_node;

Включение и снятие очереди:

         void Enqueue(bplus a){
              bplus bplusTemp; 
                 if (queue == NULL) {       //bplus queue=NULL is global variable
                 queue = a
                   queue->next = NULL;
                      }  
            else {
              bplusTemp = queue; 
                while(bplusTemp->next != NULL) {
                  bplusTemp = bplusTemp->next;
                   }
           bplusTemp->next = a;
           bplusNew->next = NULL;                     
                    }
                  }


              bplus Dequeue( void ) {
                 bplus bplusTemp = queue;
                 queue = queue->next;
                 bplusTemp->next = NULL;
                 return bplusTemp;
                   }

Модуль печати


        void   PrintBplus(bplus root){
            int i;
            bplus tempNode;
            queue = NULL;
            Enqueue(root); /*It enques the root*/
                  if(root === leaf)
                      print the keys associated with it
       while(queue != NULL){
            tempNode = Dequeue();
       for(i=0; i < tempNode->num_Keys; i++)    
           printf("%d,",root->keys[i]);
                  if(tempNode->is_Leaf == false){
                      for(i=0; i <= tempNode->num_Keys; i++)
                         Enqueue(tempNode->pointers[i]);
                       }
                }

Ответы [ 2 ]

3 голосов
/ 20 июня 2011

Используйте алгоритм BFS .

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

1 голос
/ 20 июня 2011

Я предполагаю, что под «тем, как он на самом деле выглядит», вы имеете в виду симпатичную диаграмму, например, как они печатают b-деревья в учебнике.

Печать деревьев так, как они на самом деле выглядят, довольнонетривиальная задача, если вы хотите решить ее на самом общем уровне.Проблемы включают в себя:

  • клавиши имеют переменную длину и должны располагаться по центру
  • клавиши сверху должны быть расположены далеко друг от друга, чтобы клавиши внизу не сдавливались вместе
  • оптимальное решение будет реагировать на разреженность в дереве и избегать больших пустых пространств
  • печать через несколько строк и атомарность ваших символов ASCII означают, что вы должны выяснить все сразу, а не полагаться на рекурсивный вызов.

Я потратил некоторое время, работая над этим в своем классе структур данных, но так и не пришел к полностью удовлетворительному решению.

...