二进制搜索树打印

时间:2011-11-19 02:39:31

标签: c++ io binary-tree

我正在为学校制作二元树计划,我的一切都很完美。我现在正在努力的是正确的输出。我的老师希望输出为排序后的所有数字,后面都有逗号。

我的代码我已完美地对数字进行排序并打印出来,我只是不确定如何在最后一个数字后删除逗号。

电流输出:1,2,3,4,

需要:1,2,3,4

这是我的代码:

void BinaryTree::inorder(tree_node* p)
{
    if(p != NULL)
    {
        if(p->left) 
            inorder(p->left);

        cout << p->data << ", ";

        if(p->right)
            inorder(p->right);
    }
    else
        return;
}

我已经尝试了一些方法来使它正确,但我无法弄明白。

任何帮助都会很棒。

感谢。

5 个答案:

答案 0 :(得分:5)

一种简单的方法是在数据之前打印分隔符,例如

cout << ", " << p->data;

这样我们就可以将您的问题更改为跳过第一个逗号。这更容易。提示:为了跟踪是否跳过逗号,你可能需要为函数引入另一个参数,因为它是一个递归函数。

正如xmoex指出的那样,有一种更优雅的方式来打印这棵树,从而产生非常易读和逻辑的代码。试着找到这种额外的挑战。

一个不相关的提示:你可以删除return语句,因为它是多余的 - 该函数无论如何都会返回!像这样:

void BinaryTree::inorder(tree_node* p)
{
  if (p != NULL)
  {
    // stuff goes inside here!
  }
  // no return here - the function will return anyway
}

这将产生较少的不必要代码,并且如果您需要(例如,在分配截止日期之前快速调试),将帮助您阅读自己的代码。

答案 1 :(得分:3)

也许你需要另一个关于这个问题的观点。将节点视为
<left subtree> p->data <right subtree>

目前您的节点打印为
<left subtree> p->data ", " <right subtree>每次都会导致", "落后

但是你不想在每个元素上打印", " - &GT;您只想打印", "(在正确的位置)当(且仅在!时)您下降到子树时,否则不需要分隔符。

这是一种非常简单,非常优雅的方式,无需任何额外的数据即可实现这一点...随意询问您是否需要进一步的帮助......

<强>更新 因为我觉得你的作业现在已经结束了,我想展示我的解决方案:

void BinaryTree::inorder(tree_node* p)
{
    if(p != NULL)
    {
        if(p->left) 
        {
            inorder(p->left);
            cout << ", "; // print ", " everytime after you descended to the left
        }

        cout << p->data;

        if(p->right)
        {
            cout << ", "; // print ", " everytime before you descend to the right
            inorder(p->right);
        }
   }
}

它应该看起来像 <left subtree ", "> p->data <", " rightsubtree>

答案 2 :(得分:0)

我会说你设置了一个布尔标志,你通过引用传递给你的打印例程(并且打印例程在递归时传递标记)。

最初,该标志设置为false。当您要打印某些内容时,请检查该标志。如果为false,则将flag设置为true并打印元素。如果已经存在,请打印逗号,空格和元素。

答案 3 :(得分:0)

您可以引入一个max()方法,该方法返回指向最右侧节点的指针,然后只比较指向当前节点的指针是否等于最大节点的指针。

tree_node* BinaryTree::max(tree_node *p) {
    if(p != NULL && p->right != NULL) return max(p->right);
    return p;
 }

您需要一个调用inorder()并传递最大值的包装器方法,因为您不希望在每次递归调用中计算最大值。

void BinaryTree::print() {
    inorder(root, max(root));
}

void BinaryTree::inorder(tree_node *p, tree_node *max) {
    if(p == NULL) return;        

    if(p->left) inorder(p->left, max);

    cout << p->data;
    if(p != max) cout << ", ";

    if(p->right) inorder(p->right, max);
}

答案 4 :(得分:-1)

更改

cout << p->data << ", ";
if(p->right)
{
    inorder(p->right);
}

cout << p->data;
if(p->right)
{
    cout << ", ";
    inorder(p->right);
}

即,如果你确定你的孩子有什么东西可以打印逗号。