在c中按顺序递归打印二叉树

在c中按顺序递归打印二叉树,c,recursion,tree,binary-tree,C,Recursion,Tree,Binary Tree,我一直在做一个函数,基本上应该是打印程序中的二叉树,我遇到了一个问题。树是动态的,值是数字,较大的新数字将添加到右侧,较小的新数字将添加到左侧 基本上,打印树的方式是: 假设只有值为3的根,则输出为: (3) 添加值为2的节点后: ((2)<(3)) ((2)right==NULL&&root->left==NULL){ 根->打印对象(根->值); printf(“\n”); }否则{ printf(“(”); if(isFirst==TRUE){ 如果(根->左!=NULL){ 打

我一直在做一个函数,基本上应该是打印程序中的二叉树,我遇到了一个问题。树是动态的,值是数字,较大的新数字将添加到右侧,较小的新数字将添加到左侧

基本上,打印树的方式是: 假设只有值为3的根,则输出为:

(3)
添加值为2的节点后:

((2)<(3))
((2)right==NULL&&root->left==NULL){
根->打印对象(根->值);
printf(“\n”);
}否则{
printf(“(”);
if(isFirst==TRUE){
如果(根->左!=NULL){
打印树(根,根->左,假);
printf(“”);
打印树(根,根->右,假);
}
}否则{
如果(currentNode->left!=NULL){
打印树(根,当前节点->左,假);
printf(“”);
PrintTree(根,currentNode->right,FALSE);
}
}
printf(“)”;
}
返回;
}
void PrintObject(void*值){
printf((%d)”,*(int*)值;
返回;
}
非常感谢您的帮助。
谢谢

问题已解决,缺少一个条件:

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;
}
void打印树(根*Root,节点*currentNode,布尔值isFirst)
{
if(root==NULL)
返回;
else if(root->right==NULL&&root->left==NULL)
{
根->打印对象(根->值);
返回;
}
else if(currentNode!=NULL)
{
if(currentNode->left==NULL&¤tNode->right==NULL&&isFirst==FALSE)
根->打印对象(当前节点->值);
返回;
}
其他的
{
printf(“(”);
if(isFirst==TRUE)
{
如果(根->左!=NULL)
{
打印树(根,根->左,假);
printf(“”);
打印树(根,根->右,假);
}
}
其他的
{
如果(currentNode->left!=NULL)
{
打印树(根,当前节点->左,假);
printf(“”);
PrintTree(根,currentNode->right,FALSE);
}
}
printf(“)”;
}
返回;
}

根->打印对象(…)
看起来不正确。你也可以通过在根节点上使用类型Node来简化一切。嘿,我不明白root->PrintObject()中有什么问题?啊,对不起,我错过了关于括号太多的句子。(嗯,
root->PrintObject
不应该在
C
中编译,除非
root
包含一个成员
PrintObject
,它是指向函数的指针,我真的不知道它是否是。没关系。)你能提供一个例子,说明你得到的是什么输出,你需要什么吗?代码上面已经提供了这个例子,我举了几个例子。我必须先学会正确阅读。很抱歉因此,如果我的想法正确,您的代码将为叶节点(即没有子节点的节点)打印额外的括号。我建议不要打印这些括号。您已经有了一个条件来处理根节点的这种情况(
root->left==NULL&&root->right==NULL
),但它对其他节点没有帮助。只需为currentNode添加一个类似的。
((2)<(3)>(8))
(((2))<(3)>((8))))
((2)<(3)>((7)<(8)))
(((2))<(3)>(((7))<(8)))
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;
}
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;
}