【问题标题】:print binary tree recursively inorder in c在c中递归地打印二叉树
【发布时间】:2018-03-23 06:23:41
【问题描述】:

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

基本上树的打印方式是这样的: 假设只有值为 3 的根,那么输出将是:

(3)

添加值为 2 的节点后:

((2)<(3))

我得到的输出:

(((2))<(3))

加8后:

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

我得到的输出:

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

加7后:

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

我得到的输出:

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

等等…… 请注意,第一个节点根具有不同的结构,因此分为 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;
}

将不胜感激任何形式的帮助。 谢谢!

【问题讨论】:

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

标签: c recursion tree binary-tree


【解决方案1】:

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

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    相关资源
    最近更新 更多