我正在为学校制作二元树计划,我的一切都很完美。我现在正在努力的是正确的输出。我的老师希望输出为排序后的所有数字,后面都有逗号。
我的代码我已完美地对数字进行排序并打印出来,我只是不确定如何在最后一个数字后删除逗号。
电流输出: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;
}
我已经尝试了一些方法来使它正确,但我无法弄明白。
任何帮助都会很棒。
感谢。
答案 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);
}
即,如果你确定你的孩子有什么东西可以打印逗号。