打印B + Tree的键

时间:2011-06-19 20:41:08

标签: c algorithm binary-tree

我想按照它实际在C中看的方式打印B + Tree的键。例如,以下表格

                 | 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 个答案:

答案 0 :(得分:3)

使用 BFS 算法。

基本上,通过使用FIFO队列遍历节点,您将逐个获取图层,然后您可以按照所需的顺序打印它们。

答案 1 :(得分:1)

我假设通过“实际看起来的方式”,你的意思是一个漂亮的图表,就像他们如何在教科书中打印b-tree。

如果您想在最常规的级别解决问题,那么按照实际看起来的方式打印树是一个非常非常重要的问题。问题包括:

  • 键长度可变,应居中
  • 顶部的键必须相隔很远,因此底部的键不会被挤压在一起
  • 最佳解决方案将对树中的稀疏性做出反应并避免大空间
  • 跨多行打印以及ASCII字符的原子性意味着您必须立即弄清楚所有内容,而不是依赖于递归调用。

我花了一些时间在我的数据结构课程中工作,但从未达到完全令人满意的解决方案。