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

二叉树节点病毒感染扩散异常排查:为何无法感染全部节点?

二叉树病毒感染迭代扩散问题排查

核心问题定位

病毒扩散的相邻节点应包含父节点、左子节点、右子节点,但当前实现大概率仅遍历了感染节点的左右子节点,完全忽略了父节点这条反向扩散路径。当以C为起点时,代码仅感染了C的子节点F,却未将C的父节点A纳入扩散队列,导致后续无法向A及其他分支扩散,最终停留在C、F两个节点。

修复方案

1. 给二叉树节点添加父节点引用

在节点结构中增加parent指针,构建树时同步维护父节点关系,让每个节点能访问到它的父节点,这是反向扩散的基础。

2. BFS遍历覆盖所有相邻节点

每轮感染时,对当前节点需同时检查父节点、左子节点、右子节点,确保符合条件(非空、未感染)的节点被加入扩散队列。

3. 标记已感染节点避免重复处理

通过节点内的布尔字段或哈希集合记录已感染状态,防止同一节点被多次加入队列。

修复后的核心代码示例(C语言)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// 带父节点的二叉树节点定义
typedef struct TreeNode {
    char val;
    struct TreeNode *left;
    struct TreeNode *right;
    struct TreeNode *parent;
    bool is_infected;
} TreeNode;

// 创建新节点
TreeNode* createNode(char val) {
    TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
    node->val = val;
    node->left = node->right = node->parent = NULL;
    node->is_infected = false;
    return node;
}

// 构建树并维护父节点关系
void buildTree(TreeNode* root) {
    root->left = createNode('B');
    root->left->parent = root;
    
    root->right = createNode('C');
    root->right->parent = root;
    
    root->right->right = createNode('F');
    root->right->right->parent = root->right;
}

// 迭代返回每轮感染状态
void infectionIteration(TreeNode* start) {
    if (!start) return;

    TreeNode* queue[100];
    int front = 0, rear = 0;
    start->is_infected = true;
    queue[rear++] = start;

    int round = 0;
    while (front < rear) {
        int currentBatchSize = rear - front;
        printf("第%d轮感染节点:", ++round);
        
        // 记录本轮新感染节点
        char infectedNodes[100];
        int idx = 0;
        for (int i = 0; i < currentBatchSize; i++) {
            TreeNode* curr = queue[front++];
            infectedNodes[idx++] = curr->val;

            // 检查父节点
            if (curr->parent && !curr->parent->is_infected) {
                curr->parent->is_infected = true;
                queue[rear++] = curr->parent;
            }
            // 检查左子节点
            if (curr->left && !curr->left->is_infected) {
                curr->left->is_infected = true;
                queue[rear++] = curr->left;
            }
            // 检查右子节点
            if (curr->right && !curr->right->is_infected) {
                curr->right->is_infected = true;
                queue[rear++] = curr->right;
            }
        }

        // 输出本轮结果
        for (int i = 0; i < idx; i++) {
            printf("%c ", infectedNodes[i]);
        }
        printf("\n");
        
        // 无新节点感染则终止
        if (rear - front == 0) break;
    }
}

int main() {
    TreeNode* root = createNode('A');
    buildTree(root);
    // 以节点C为感染起点
    infectionIteration(root->right);
    return 0;
}

输入输出示例

输入:以节点C为感染起点
输出:
第1轮感染节点:C
第2轮感染节点:A F
第3轮感染节点:B

关键注意事项

  • 病毒扩散是无向的,必须将父节点纳入相邻节点范围,否则会出现单向扩散的死胡同。
  • 必须通过标记过滤已感染节点,避免队列中重复加入同一节点导致死循环或无效计算。
  • 构建树时要确保父节点指针正确赋值,这是反向扩散的前提条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:20:09