2014-12-09 2 views
0

이진 트리를 인쇄하는 데 문제가 있습니다. 기본적으로 각 노드는 키와 데이터의 두 가지 값을 포함합니다. 이 할당에 문제가 있습니다.C++에서 지정된 들여 쓰기 수준의 이진 트리 인쇄

\ t 대신 이중 공간을 사용할 것으로 예상됩니다. 기본적으로는, 의미 \에서 t = 2 개 공간 \ t \ t 내 문제, I는 다음과 같은 방법으로 printIndented 방법을 구현한다

= 4 대, \ t \ t \ t는 = 6 개 공간 -

다음과 같이 나에게 출력을주고있다
void 
TreeDictionary::printIndented(TreeNode * node, int level) { 
     if (node == NULL) 
       return; 
     if (level == 0) 
     { 
      std::cout << node->_key << ':' << node->_data << "\n"; 
      level++; 
      printIndented(node->_left, level); 
      printIndented(node->_right, level); 
     } 
     else 
     { 
       if ((node->_left == NULL) && (node->_right == NULL)) 
         cout << '\t'; 
       cout << "\t" << node->_key << ':' << node->_data << endl; 
       if ((node->_left != NULL) && (node->_right != NULL)) 
         cout << '\t'; 
       printIndented(node->_left, level); 
       if ((node->_left != NULL) && (node->_right != NULL)) 
         cout << '\t'; 
       printIndented(node->_right, level);  
     } 
} 

는 - 나는 NULL 항목이 발견 될 때마다 NULL 값과 인쇄 NULL을 설명 할 수없는 생각처럼

---=WHAT I AM GETTING=--- 
pineapple:0 
     kiwi:1 
       grapes:3 
       apple:5 
       orange:6 
     lime:8 
     olives:9 
       mango:10 
     strawberry:4 
       watermelon:7 

---=EXPECTED OUTPUT=--- (as you see it prints 2 spaces instead of each \t) 
pineapple:0 
    kiwi:1 
    grapes:3 
     apple:5 
     NULL 
     NULL 
     NULL 
    orange:6 
     lime:8 
     NULL 
     olives:9 
      mango:10 
      NULL 
      NULL 
      NULL 
     NULL 
    strawberry:4 
    NULL 
    watermelon:7 
     NULL 
     NULL 

보인다. 모든 도움을 주시면 감사하겠습니다!

참고 :이 프로그램에서는 기본 들여 쓰기 수준이 0으로 예상됩니다.

답변

2

당신이 실제로있는 수준을 알면서 얻는 정보를 실제로 사용하지 않습니다. 화면의 가장 왼쪽 가장자리에서 들여 쓰기라고 생각하십시오. 레벨 당 2 * 레벨 공백으로 들여 쓰기를 원합니다. 출력에서 NULL 노드가 NULL을 출력하는 것처럼 보입니다. 다음 행을 따라 뭔가를 시도해 볼 수 있습니다.

Indent(Treenode *node, int level){ 
    std::cout << std::string(2*level, ' '); 
    if(node == NULL){ 
    std::cout << "NULL" << std::endl; 
    }else{ 
    std::cout << node->_key << ":" << node->_data << std::endl; 
    level += 1; 
    Indent(node->_right, level); 
    Indent(node->left, level); 
    } 
} 
+0

감사합니다. – NatureDevil

0

우선 레벨 0의 첫 번째 노드에 하위 노드가 있는지도 확인해야합니다. 그렇지 않으면 트리에 하나의 노드 만있는 경우 오류가 발생할 수 있습니다.

둘째, 난 당신이이 문 경우, 이것은 매우 읽을 혼동하지 후 컬링 괄호를 사용하는 것이 좋습니다 :

if((node->_left != NULL) && (node->_right != NULL)) { 
    cout << "\t"; //or in your case maybe: cout << " "; //see point 3 
} 

셋째 점, 당신은 대신에 '\의 t'의 공간을 인쇄 할 때 '\ t'대신에 ''를 사용해야합니다. 문자 대신에 문자열을 출력하는 구문 인 "\ t"도 사용합니다. 이것은 틀린 것은 아니지만 원칙을 이해해야한다고 생각합니다. '\ t'= const char, "\ t"= const string

네 번째로, 다른 종류의 들여 쓰기로 인쇄하기 위해 유지하는 기준을 이해하지 못합니다. 따라서 수행하려는 것을 설명 할 수 있다면 if 문을 사용하면 멋질 것입니다. 그런 다음 설명해 줄 수 있습니다.

궁금한 사항이 있거나 도움이되지 않는다고 생각하시면 알려주세요. 행운을 빈다.