二叉搜索树打印
Binary Search Tree Printing
我正在为学校做一个二叉树程序,一切都运行得很好。我现在所做的就是正确的输出。我的老师希望输出的是所有的数字按顺序排序,后面加逗号。
我的代码,我有完美排序的数字和打印它们,我只是不确定如何删除逗号后的最后一个数字。
电流输出: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);
}
。
- 有根的二进制搜索树.保留与其父级的链接
- 正在尝试重载二进制搜索树分配运算符
- 使用C++创建特殊的二叉搜索树
- 在递归二叉搜索树中搜索
- 在二叉搜索树中插入时出现分段错误
- C++二叉搜索树模板从函数返回节点
- 我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
- 在二叉搜索树C++中计算平均值
- 在字符串的二叉搜索树中搜索子字符串 - C++
- 如何打印在二叉搜索树中找到的数据?
- 二叉搜索树使用最常用的节点来打印出某些语句
- 如何以特定格式C++打印二叉搜索树
- 无法打印完整的二叉搜索树,因为我从最低节点向后迭代的逻辑有缺陷
- 在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃
- 二叉搜索树按级别递归C++打印节点
- C++二叉搜索树打印和深度计算
- 如何使用字符串流C++递归打印出二进制搜索树中的所有节点
- 用指针打印二进制搜索树C++的奇怪方法
- 二叉搜索树打印
- 递归地打印二叉搜索树的内容