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

BFS算法变体疑问:两类兄弟节点连接相似代码差异求解

逻辑差异说明

两段代码都基于BFS层序遍历实现,核心差异仅在于是否对层与层的连接做隔离:

1. 第一类代码:连接同层相邻兄弟节点

class Solution {
public:
    Node* connect(Node* root) {
        return helper(root);
    }
    
    Node* helper(Node* root)
    {
        if(root==NULL)           
            return root;
        
        queue<Node*>queue;
        queue.push(root);
        
        while(!(queue.empty()))
        {
            int levelsize=queue.size();
            Node* prev=NULL;
            
            for(int i = 0  ; i < levelsize ; i++)
            {
                Node* current=queue.front();
                queue.pop();
                
                if(prev!=NULL)
                    prev->next=current;
                
                prev=current;
                
                if(current->left!=NULL)
                    queue.push(current->left);
                if(current->right!=NULL)
                    queue.push(current->right);
                
            }   
        }

        return root;
    }
};

这段代码的核心是在while循环内部加了一层遍历当前层所有节点的for循环,每处理新的一层之前都会把prev重置为NULL:

  • 仅同层的相邻节点会建立next关联
  • 每一层的最后一个节点的next保持为NULL,不会和下一层的第一个节点连通
    最终效果是树的每一层各自形成独立的单链表。

2. 第二类代码:按层序顺序全局连接所有节点

你贴出的第二段代码存在笔误,prev变量定义在while循环内部会导致每次循环都被重置为NULL,所有next指针都无法赋值。正确的实现逻辑是把prev放到while循环外初始化,不需要分层遍历的逻辑:

class Solution {
public:
    Node* connect(Node* root) 
    {
       return helper(root);
    }
    
    Node* helper(Node* root)
    {
        if(root==NULL)           
            return root;
        
        queue<Node*>queue;
        queue.push(root);
        Node* prev=NULL; // prev移到while循环外部初始化
        
        while(!(queue.empty()))
        {
            Node* current=queue.front();
            queue.pop();
            
            if(prev!=NULL)
                prev->next=current;
            
            prev=current;
            
            if(current->left!=NULL)
                queue.push(current->left);
            if(current->right!=NULL)
                queue.push(current->right);
        }
        return root;
    }
};

这段逻辑不再做层边界隔离:

  • 所有节点按照BFS层序遍历的先后顺序建立next关联
  • 前一层的最后一个节点的next会指向下一层的第一个节点
    最终效果是整棵树所有节点形成一个完整的单链表。

适用场景

  • 同层连接实现:对应LeetCode 116、117考点,常用于需要分层处理节点的场景,比如输出树的右视图、计算每层节点的平均值/总和、分层打印树结构等。
  • 全局层序连接实现:适用于需要把树拍平为层序顺序线性结构的场景,比如层序序列化树、批量按遍历顺序处理所有节点、不需要区分层边界的快速遍历等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 18:27:06