2016-06-02 6 views
-1

ノードツリーを渡す関数があります。 関数はこの形式でノードツリーを印刷するようになっている:再帰関数を使用してノードツリーを印刷する方法

root 
node 
    node 
    node 
node 
node 
    node 
    node 
node 

私はそれを行う方法のまわりで私の頭をラップするように見える傾けます。 これは私がこれまでに得たものである:

void IterateTree(Node &rNode) 
{ 
    printf("\t\n"); 
    std::cout << rNode.Name() << std::endl; 

    int i = 0; 
    for (std::list<Node>::iterator it = rNode.childs.begin(); it != rNode.childs.end(); ++it) 
    { 
     printf("%d: ", i); 
     IterateTree(*it); 
     printf("\b"); 
     i++; 
    } 
} 

、私の質問は:正しいインデントでノードツリーを反復し、印刷の標準的な方法はありますか?

+1

私にはうまく見えますが、ちょっと別のパラメータ 'depth'を追加するだけで、子供をインデントする程度を知ることができます – softwarenewbie7331

答えて

1

は再帰

void IterateTree(Node &rNode , int depth) 
{ 
    printf("\t\n"); 
    std::cout << rNode.Name() << std::endl; 

    int i = 0; 
    for (std::list<Node>::iterator it = rNode.childs.begin(); it != rNode.childs.end(); ++it) 
    { 
     for(int j=0; j<depth; j++){printf(" ");} 
     printf("%d: ", i); 
     IterateTree(*it, depth+1); 
     printf("\b"); 
     i++; 
    } 
} 

の「深さ」を追跡するために、別のパラメータを使用して私の答えは:少数の人々は、プレーンテキストで、特に、木ではなく印刷するので、インデントのための標準はありません。

0

テストしていませんが、私の最初の推測はsthです。

void iterateTree(Node &node, int level = 0){ 
    for(int i = 0; i < level; i++) printf("\t"); //foreach level print a tab 

    cout << rNode.Name() << endl; //output the node 

    int i = 0; 
    level += 1; //if the for runs there is a next level 
    for(list<Node>::iterator it = r.Node.childs.begin(); it != rNode.childs.end(); ++it){ 
     iterateTree(it, level); 
    } 
} 
関連する問題