如何层序打印二叉搜索树,包含NULL空节点并将空值打印为0
问题描述
现有一棵右斜结构的二叉搜索树,结构如下:
5 \ 6 \ 7 \ 9
已实现的基础层序打印功能输出为:
5, 6, 7, 9,
目标打印效果为将所有NULL空节点统一打印为0,预期输出格式如下:
5, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 9,
当前已编写的按层遍历函数current_height代码如下:
void current_height(tree *root, int level){ if(root == NULL){ return; } if(level == 1){ printf("%d, ", root->data); } else if(level > 1){ current_height(root->left, level - 1); current_height(root->right, level - 1); } }
此前评估过在tree结构体中新增索引字段、将二叉树转换为数组结构后直接打印的方案,该方案会大幅提升节点删除功能的实现复杂度,因此不采用,需要在不修改原有树结构的前提下实现目标打印效果。
可行实现方案
原有代码的核心问题是遇到NULL节点就直接返回,既没有输出占位的0,也没有继续递归遍历NULL节点对应的虚拟子节点,导致空节点位置被直接跳过。不需要修改树结构体,也不需要额外做数组转换,仅调整递归逻辑即可实现需求,具体步骤如下:
- 新增计算树总高度的函数,用来控制遍历的总层数,避免无限递归
- 修改按层遍历逻辑:递归到NULL节点时不直接返回,若当前到达目标层则输出0,未到达目标层则继续向该虚拟空节点的左右子位置递归(传入NULL做占位)
- 在每层遍历结束后输出换行,匹配目标格式
修改后的可运行代码参考:
// 计算二叉树总高度 int get_tree_height(tree* root) { if (root == NULL) return 0; int left_h = get_tree_height(root->left); int right_h = get_tree_height(root->right); return left_h > right_h ? left_h + 1 : right_h + 1; } // 按层打印节点,空节点输出0占位 void print_level(tree* node, int level_remain) { if (level_remain == 1) { node == NULL ? printf("0, ") : printf("%d, ", node->data); return; } // 未到目标层时,无论当前节点是否为空,都继续向下遍历左右位置 if (node == NULL) { print_level(NULL, level_remain - 1); print_level(NULL, level_remain - 1); } else { print_level(node->left, level_remain - 1); print_level(node->right, level_remain - 1); } } // 层序打印入口 void level_order_print(tree* root) { int total_h = get_tree_height(root); for (int i = 1; i <= total_h; i++) { print_level(root, i); printf("\n"); } }
逻辑说明
针对给出的右斜树样例,树总高度为4,代码运行逻辑和输出完全匹配预期:
- 第1层共1个位置,输出
5,后换行 - 第2层共2个位置,5的左节点为空输出0,右节点为6输出6,即
0, 6,后换行 - 第3层共4个位置,6的左子树全为空占3个位置,右节点为7占1个位置,输出
0, 0, 0, 7,后换行 - 第4层共8个位置,7的左子树全为空占7个位置,右节点为9占1个位置,输出
0, 0, 0, 0, 0, 0, 0, 9,后换行
该方案不会修改原有树的结构体定义,完全不影响插入、删除等原有功能的实现,递归逻辑仅在打印阶段生效,无额外的结构存储开销。
内容的提问来源于stack exchange,提问作者SANTAR276
相关产品推荐
相关产品推荐

