C语言中序遍历打印二叉搜索树时如何去除末尾多余逗号和空格
问题说明
通过中序遍历打印二叉搜索树时,期望得到无末尾标点的逗号分隔数值序列:
2, 3, 6, 9
实际运行输出末尾多了冗余的逗号和空格:
2, 3, 6, 9,
当前使用的代码如下:
中序遍历实现:
void inorder(struct node* root) { if (root != NULL) { inorder(root->left_node); printf("%d, ", root->value); inorder(root->right_node); } }
二叉树节点结构体定义:
struct node { int value; struct node *left_node; struct node *right_node; };
问题原因
现有逻辑对所有访问到的节点,都固定输出数值, 格式的内容,没有区分节点是否为中序序列的最后一个元素,因此遍历到最后一个节点时也会附带打印逗号和空格,造成末尾冗余字符。
修复方案
最简洁且边界兼容性最好的实现方式,是增加一个标记位记录当前是否为第一个打印的节点:第一个节点直接输出数值,后续所有节点先输出, 前缀再输出数值,从根源避免末尾出现多余标点。
单次调用简易版本
如果这个遍历函数只会被单次调用,可以用静态变量实现标记,代码改动最小:
void inorder(struct node* root) { static int is_first = 1; if (root != NULL) { inorder(root->left_node); if (is_first) { printf("%d", root->value); is_first = 0; } else { printf(", %d", root->value); } inorder(root->right_node); } }
注意:静态变量的生命周期贯穿程序整个运行周期,如果需要多次调用遍历函数打印不同的树,静态标记会残留上次调用的状态,导致输出格式错误,这种场景下用传参的方式传递标记更稳妥。
多次调用兼容版本
把标记变量定义在遍历入口函数中,通过指针传给递归辅助函数,每次调用都会重置标记状态:
static void inorder_helper(struct node* root, int* is_first) { if (root == NULL) { return; } inorder_helper(root->left_node, is_first); if (*is_first) { printf("%d", root->value); *is_first = 0; } else { printf(", %d", root->value); } inorder_helper(root->right_node, is_first); } void inorder(struct node* root) { int is_first = 1; inorder_helper(root, &is_first); printf("\n"); // 按需添加末尾换行 }
不推荐尝试在递归中判断当前节点是否为中序最后一个节点的实现方式:这类方案需要额外遍历树的最右路径找尾节点,递归中判断逻辑冗余,很容易在单边树、空树等边界场景出错。
内容的提问来源于stack exchange,提问作者user19446449
相关产品推荐
相关产品推荐

