2012-08-06 72 views
0

我有一个遍历级顺序的AVL树的函数。输出格式为:在递归函数中保持计数C++

level 0: jim(2) 
level 1: bob(1) joe(1) 

但是当我到4级了,我要打破它,所以它只会显示每行8个项目。所以出来看起来是这样的:

level 4: item1(1) item2(1) item3(2) item4(2) item5(1) item6(2) item7(1) item8(2) 
level 4: item9(2) item10(2) 

现在我的代码将显示所有的项目,但只在一行。我无法弄清楚如何改进这些代码,以便按照我想要的格式进行格式化。我怎样才能实现这个?

以下是当前功能:

//PRINT BY LEVEL ORDER TRAVERSAL 
void Avltree::level_order(Avlnode* root, ofstream &out){ 
int h = height(root); 
for(int i = 0; i < h; i++){ 
    out << "Level " << i << ": "; 
    print_level(root, i, out); 
    out << endl; 
} 
} 

//PRINT A GIVEN LEVEL ON A TREE 
void Avltree::print_level(Avlnode* root, int level, ofstream &out){ 

    if(root == NULL) 
     return; 
    if(level == 0){ 
     out << root->data << "(" << height(root) << ") "; 
    } 
    else if (level > 0) 
    { 
     print_level(root->left, level-1, out); 
     print_level(root->right, level-1, out); 
    } 
} 

回答

2

你应该通过计数作为参数传递给递归函数,当计数%8(或任何你想要的每行要数)为0,则开始新的一行。

+0

谢谢!我不确定为什么当我这样做时它不工作,但它现在起作用。谢谢。 – Jordan 2012-08-06 17:22:54

2

引用参数添加呼叫为节点总数印刷

void Avltree::print_level(Avlnode* root, int level, ofstream &out, int &count) 
{ 
    ... 
    if(level == 0){ 
     out << root->data << "(" << height(root) << ") "; 
     count++; 
    } 
    if(count==8){ 
     out << endl; 
     count=0; 
    } 
    ... 
} 

而主叫将

int count=0; 
for(int i = 0; i < h; i++){ 
    count=0; 
    out << "Level " << i << ": "; 
    print_level(root, i, out, count); 
    out << endl; 
} 
+0

谢谢!这太棒了!不知道为什么它以前没有工作 – Jordan 2012-08-06 17:33:27