2015-01-25 4 views
-1

Я работал над функцией, которая в основном должна печатать двоичное дерево, которое у меня есть в программе, и у меня проблема. дерево - это динамит, а значения - числа, в правой части будет добавлен новый номер, а в левой - меньший.печатать двоичное дерево рекурсивно inorder в c

в основном то, как дерево должно быть напечатано это: скажем, есть только корень со значением 3, то выход будет:

(3) 

после добавления узла со значением 2 :

((2)<(3)) 

значение выходной я получаю:

(((2))<(3)) 

после добавления 8:

((2)<(3)>(8)) 

Выходной сигнал я получаю:

(((2))<(3)>((8)))) 

после добавления 7:

((2)<(3)>((7)<(8))) 

значение выходной я получаю:

(((2))<(3)>(((7))<(8))) 

и т. д. ... заметили, что первое n ode, корень имеет другую структуру, поэтому разделение на 2 случая.

Основная проблема заключается в том, что я получаю слишком много скобок.

это код, я написал до сих пор:

void PrintTree(Root* root, Node* currentNode,Boolean isFirst) 
{ 
    if (root==NULL) 
    return; 
    else if (root->right==NULL&&root->left==NULL) 
    { 
     root->PrintObject(root->value); 
     printf("\n"); 
    } 
    else 
    { 
     printf("("); 
     if (isFirst==TRUE) 
     { 
      if (root->left!=NULL) 
      { 
       PrintTree(root,root->left,FALSE); 
       printf("<"); 
      } 
      root->PrintObject(root->value); 

      if (root->right!=NULL) 
      { 
       printf(">"); 
       PrintTree(root,root->right, FALSE); 
      } 
     } 
     else 
     { 
      if (currentNode->left!=NULL) 
      { 
       PrintTree(root,currentNode->left, FALSE); 
       printf("<"); 
      } 

      root->PrintObject(currentNode->value); 

      if (currentNode->right!=NULL) 
      { 
       printf(">"); 
       PrintTree(root,currentNode->right, FALSE); 
      } 
     } 
     printf(")"); 
    } 
    return; 
} 

void PrintObject(void* value) 
{ 
    printf("(%d)", *(int*)value); 
    return; 
} 

был бы признателен за любую помощь. спасибо!

+0

'корне-> PrintObject (...)' не выглядит правильно. И вы, вероятно, могли бы упростить все, используя также тип Node для корневого узла. – Inspired

+0

эй, я не понимаю, в чем проблема в root-> PrintObject()? – Ryan

+0

Ах, извините, я пропустил предложение о том, чтобы получить слишком много скобок. (Ну, 'root-> PrintObject' не должен компилироваться в' C', если 'Root' не содержит члена' PrintObject', который является указателем на функцию, и я действительно не знаю, не так ли. вы приводите пример того, какой результат вы получаете по сравнению с тем, что вам нужно? – Inspired

ответ

0

проблема решена, условие отсутствовало:

void PrintTree(Root* root, Node* currentNode,Boolean isFirst) 
{ 
    if (root==NULL) 
    return; 
    else if (root->right==NULL&&root->left==NULL) 
    { 
     root->PrintObject(root->value); 
     return; 
    } 
    else if (currentNode!=NULL) 
    { 
     if(currentNode->left==NULL&&currentNode->right==NULL&&isFirst==FALSE) 
     root->PrintObject(currentNode->value); 
     return; 
    } 
    else 
    { 
     printf("("); 
     if (isFirst==TRUE) 
     { 
      if (root->left!=NULL) 
      { 
       PrintTree(root,root->left,FALSE); 
       printf("<"); 
      } 
      root->PrintObject(root->value); 

      if (root->right!=NULL) 
      { 
       printf(">"); 
       PrintTree(root,root->right, FALSE); 
      } 
     } 
     else 
     { 

      if (currentNode->left!=NULL) 
      { 
       PrintTree(root,currentNode->left, FALSE); 
       printf("<"); 
      } 

      root->PrintObject(currentNode->value); 

      if (currentNode->right!=NULL) 
      { 
       printf(">"); 
       PrintTree(root,currentNode->right, FALSE); 
      } 
     } 
     printf(")"); 
    } 
    return; 
} 
Смежные вопросы