调用打印AVL树的void函数后如何删除行末多余的逗号和空格
AVL树中序遍历打印消除末尾多余逗号空格的解决方案
你尝试使用std::cout << '\b' << '\b'的方案无法达到预期,本质是退格符仅会在交互式终端场景下移动光标位置,不会真正删除已输出的字符,如果将程序输出重定向到文件,你会看到末尾保留的是退格符本身,兼容性极差,不建议使用。
以下是两种可行的实现方案:
- 方案1:修改递归逻辑,从根源避免生成多余字符(最推荐)
新增一个布尔标记位判断当前打印的是不是第一个元素,第一个元素直接输出值,后续所有元素都先输出逗号空格再输出值,完全不会产生末尾的多余字符。
// 中序遍历辅助函数,新增isFirst引用参数作为标记 void InorderHelper(Node* root, bool& isFirst) { if (!root) return; InorderHelper(root->left, isFirst); if (isFirst) { std::cout << root->key; isFirst = false; } else { std::cout << ", " << root->key; } InorderHelper(root->right, isFirst); } void printInoder(Node* root) { bool isFirst = true; InorderHelper(root, isFirst); std::cout << std::endl; }
- 方案2:不修改原有遍历逻辑,通过字符串流中转处理
如果不想改动原有InorderHelper的实现,可以将输出临时重定向到字符串流,处理掉末尾多余字符后再统一输出到标准输出。
#include <sstream> #include <string> void printInoder(Node* root) { std::stringstream ss; // 保存cout原输出缓冲区,将输出临时重定向到字符串流 auto oldCoutBuf = std::cout.rdbuf(ss.rdbuf()); InorderHelper(root); // 恢复cout原输出缓冲区 std::cout.rdbuf(oldCoutBuf); std::string outputStr = ss.str(); // 长度足够时删除末尾2个字符(逗号+空格),空树场景也不会越界 if (outputStr.size() >= 2) { outputStr = outputStr.substr(0, outputStr.size() - 2); } std::cout << outputStr << std::endl; }
内容的提问来源于stack exchange,提问作者user17005485
相关产品推荐
相关产品推荐

