二叉树层序遍历的两种写法(BFS和DFS)

力扣链接:102. 二叉树的层序遍历 - 力扣(LeetCode) (leetcode-cn.com)

写法1:BFS写法(通过队列辅助实现)


class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*>q;
        if(root) q.push(root);
        vector<vector<int>>res;
        while(!q.empty()){
            int size = q.size();//用常量size记录当前的队列中的结点数量
            vector<int>tmp;
            for(int i=0;i<size;i++)
            {
                TreeNode* k = q.front();
                tmp.push_back(k->val);
                q.pop();
                if(k->left)
                {
                    q.push(k->left);
                }
                if(k->right)
                {
                    q.push(k->right);
                }
            }
            res.push_back(tmp);//同时压入这一层结点的所有左右结点,我一开始也没看懂那个输出...
        }
        return res;
    }

};

写法2:递归写法(DFS写法)


class Solution {
public:
    vector<vector<int>>res;
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(!root) return {};//空树返回空
        levelTraversal(root,0);
        return res;
    }
    void levelTraversal(TreeNode* root,int layer)
    {
        if(root)
        {
            if(res.size() == layer)//如果res中这一层还没有开辟vector存储空间,那么就进行开辟
            {
                res.push_back(vector<int>());
            }
            res[layer].push_back(root->val);//将结点值存入对应层的结果数组
        }
        if(root->left)
        {
            levelTraversal(root->left,layer + 1);   
        }
        if(root->right)
        {
            levelTraversal(root->right,layer + 1);   
        }
    }

};

<think>好的,用户需要DFSBFS的算法模板实现示例。首先,我需要回忆一下这两种算法的基本概念步骤。DFS通常用递归或栈实现,而BFS用队列。接下来得确认用户是否需要代码示例,以及用什么编程语言。用户提供的示例中用了Python,所以可能倾向于Python的代码。 然后,要确保模板的正确性,比如DFS的递归迭代写法BFS的标准队列处理。还要考虑是否需要注释说明每一步的作用,让用户更容易理解。此外,用户提到了引用资料,需要检查是否有相关的引用可以对应到内容里。例如,引用[3]提到BFS用于找最短路径,这点可以在BFS部分提到。 接下来,要组织回答结构。先简要介绍DFSBFS,然后分别给出模板代码示例。可能还需要比较两者的区别应用场景,但用户主要问的是模板实现,所以这部分可以放在相关问题里。同时,要确保代码符合格式要求,使用正确的LaTeX语法,比如变量用$...$包裹。 需要注意用户提供的引用内容,比如引用[4]解释了BFS是逐层遍历,所以在描述BFS时应该提到这一点。同时,引用[3]提到BFS找的是最短路径,这在BFS的应用中很重要,应该强调。 在编代码时,要检查语法是否正确,比如Python的队列操作是否使用deque,递归的终止条件是否明确。此外,示例应用场景,比如二叉树的遍历,可能有助于用户理解模板的使用。 最后,生成相关问题,考虑用户可能的后续疑问,比如性能比较、应用场景、优化方法等。确保问题覆盖常见的学习点,帮助用户深入理解。</think>### 深度优先搜索(DFS)与广度优先搜索(BFS)算法模板 #### 1. **DFS 算法模板** DFS 通过递归或栈实现,优先探索“深度”方向,适合解决路径问题、连通性问题等[^3]。 **递归模板(以二叉树遍历为例)**: ```python def dfs(node): if node is None: # 终止条件 return # 处理当前节点(前序遍历) print(node.val) dfs(node.left) # 递归左子树 dfs(node.right) # 递归右子树 ``` **迭代模板(使用栈)**: ```python def dfs_iterative(root): stack = [root] while stack: node = stack.pop() if node: # 处理当前节点 print(node.val) stack.append(node.right) # 右子节点先入栈(后处理) stack.append(node.left) # 左子节点后入栈(先处理) ``` #### 2. **BFS 算法模板** BFS 通过队列实现,逐层扩展搜索,适合找最短路径、层序遍历等[^4]。 ```python from collections import deque def bfs(root): queue = deque([root]) while queue: level_size = len(queue) for _ in range(level_size): # 遍历当前层所有节点 node = queue.popleft() # 处理当前节点 print(node.val) if node.left: queue.append(node.left) # 左子节点入队 if node.right: queue.append(node.right) # 右子节点入队 ``` --- ### **示例应用场景** - **DFS**:二叉树的前/中/后序遍历、图的连通性判断、回溯问题(如八皇后)[^2]。 - **BFS**:二叉树层序遍历、最短路径(如迷宫问题)、社交网络中的“六度空间”理论。 --- ### **对比与核心区别** 1. **数据结构**:DFS用栈(递归隐式栈),BFS用队列。 2. **搜索顺序**:DFS优先深度,BFS优先广度。 3. **空间复杂度**:BFS通常高于DFS(尤其在树形结构较宽时)。 4. **适用场景**:DFS适合存在性判断,BFS适合最短路径问题[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值