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

二叉树条件节点计数问题求助:现有C代码优化思路咨询

二叉树满足条件节点计数问题

问题描述

需要遍历二叉树(BinTree),统计满足指定条件的节点出现次数。尝试在条件满足时返回计数加1,不满足时返回计数加0,但遇到问题,寻求可行思路。现有代码如下:

int countChoose(BinTree *root) {
    if (root == NULL)
        return 0;
    updateTask(root);
    if (root->whatToDo == COUNT_MALE_ORDER) {
        if (root->gender == 'M') {
            return 1 + countChoose(root->left) +
                       countChoose(root->right);

        }
        return 0 + countChoose(root->left) +
                   countChoose(root->right);
    }

}

问题分析与修正思路

  • 缺失默认返回值:当前代码中,如果root->whatToDo != COUNT_MALE_ORDER,函数没有返回值,会触发未定义行为,必须补充默认返回逻辑——此时应直接递归遍历左右子树,返回子树的计数总和,因为当前节点不触发计数规则。
  • 代码冗余优化:可合并条件判断,简化逻辑,避免重复的递归调用。先计算当前节点的贡献值(符合条件为1,否则0),再加上左右子树的计数即可。

修正后的代码示例

int countChoose(BinTree *root) {
    if (root == NULL)
        return 0;
    
    updateTask(root);
    
    int current_count = 0;
    // 仅当任务类型为COUNT_MALE_ORDER且性别为男时,当前节点计数+1
    if (root->whatToDo == COUNT_MALE_ORDER && root->gender == 'M') {
        current_count = 1;
    }
    
    // 递归遍历左右子树,累加计数
    return current_count + countChoose(root->left) + countChoose(root->right);
}

关键说明

  • 空节点处理:保留原逻辑,空树直接返回0,作为递归终止条件。
  • 任务更新:保留updateTask(root)调用,确保节点的whatToDo状态为最新。
  • 默认情况处理:无论当前节点任务类型是否为COUNT_MALE_ORDER,都会递归处理左右子树,避免遗漏子树中符合条件的节点。

内容的提问来源于stack exchange,提问作者Dor Shroitman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:25:19