You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何层序打印二叉搜索树,包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 11:15:41