二叉搜索树打印

Binary Search Tree Printing

本文关键字:打印 搜索树      更新时间:2023-10-16

我正在为学校做一个二叉树程序,一切都运行得很好。我现在所做的就是正确的输出。我的老师希望输出的是所有的数字按顺序排序,后面加逗号。

我的代码,我有完美排序的数字和打印它们,我只是不确定如何删除逗号后的最后一个数字。

电流输出: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;
}

我已经尝试了一些方法来纠正它,但我就是不明白。

请帮忙就太好了。

谢谢。

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

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
}

这将产生更少的不必要的代码,并将帮助您阅读自己的代码,例如,如果您需要在作业截止日期之前快速调试它。

也许你需要换个角度来看待这个问题。把节点想象成
<left subtree> p->data <right subtree>

现在你的节点被打印成
<left subtree> p->data ", " <right subtree>导致每次都尾随", "

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

有一种非常简单、非常优雅的方法可以实现这一点,而不需要携带任何额外的数据…如果你需要进一步的帮助,请尽管开口。

更新:我想现在你们的作业已经完成了,我想展示一下我的解决方案:

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>

您可以引入一个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);
}

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

最初标志设置为false。当你要打印什么东西时,检查一下旗子。如果为false,则将flag设置为true并打印元素。如果已经为真,则打印逗号、空格和元素。

变化

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

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