【2025刷题笔记】- 二叉树的广度优先遍历
刷题笔记合集🔗
二叉树的广度优先遍历
问题描述
小毛有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。
现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请你输出层序遍历的结果。层序遍历是指从树的顶层开始向下,每层中按照从左向右的顺序遍历节点。
输入格式
每个输入文件一行,第一个字符串表示后序遍历结果,第二个字符串表示中序遍历结果。(每串只包含大写字母)
中间用单空格分隔。
输出格式
输出仅一行,表示层序遍历的结果,结尾换行。
样例输入
CBEFDA CBAEDF
样例输出
ABDCEF
数据范围
- 节点数
- 节点值仅为大写字母
| 样例 | 解释说明 |
|---|---|
| 样例1 | 输入给出后序遍历CBEFDA和中序遍历CBAEDF 可以得到二叉树结构为: A /\ B D / C E F 层序遍历从上到下,从左到右依次访问:A->B->D->C->E->F 因此输出ABDCEF |
题解
这道题目要求根据二叉树的后序遍历和中序遍历结果,输出层序遍历结果。
首先回顾一下三种常见的遍历方式:
- 前序遍历(根-左-右)
- 中序遍历(左-根-右)
- 后序遍历(左-右-根)
层序遍历则是按照树的层级,从上到下,从左到右依次访问每个节点。
解题思路是:根据后序遍历和中序遍历重建二叉树,然后进行层序遍历。
具体步骤如下:
- 从后序遍历结果中确定根节点(后序遍历的最后一个元素)
- 在中序遍历中找到根节点位置,根节点左边是左子树,右边是右子树
- 根据左右子树的长度,将后序遍历结果也分成左右子树部分
- 递归处理左右子树,重建整个二叉树
- 使用队列实现层序遍历,从上到下、从左到右遍历节点
不过,我们可以用更巧妙的方法避免显式重建树结构。我们可以直接使用广度优先搜索(BFS)来实现层序遍历效果:
- 从后序遍历找到根节点
- 根据中序遍历将树分为左右子树
- 将当前根节点加入结果
- 将左右子树的后序和中序遍历结果作为新的任务加入队列
- 从队列取出任务并重复上述步骤
时间复杂度分析:虽然看起来我们有嵌套循环,但每个节点只会被处理一次,所以时间复杂度为O(n),其中n是节点数量。空间复杂度也是O(n),用于存储队列和结果。
对于给定的数据范围(最多26个节点),这个算法是非常高效的。
参考代码
- Python
import sys
from collections import deque
input = lambda:sys.stdin.readline().strip()
# 读取输入
line = input()
post_order, in_order = line.split()
def bfs_traversal(post_order, in_order):
"""使用BFS实现层序遍历"""
result = [] # 存储层序遍历结果
queue = deque([(post_order, in_order)]) # 初始化队列
while queue:
post, inord = queue.popleft()
# 如果子树为空,跳过
if not post:
continue
# 根节点是后序遍历的最后一个元素
root = post[-1]
result.append(root) # 添加到结果中
# 找到根在中序遍历中的位置
root_idx = inord.index(root)
# 确定左右子树的大小
left_size = root_idx
# 分割左子树的后序和中序
if left_size > 0:
left_post = post[:left_size]
left_in = inord[:root_idx]
queue.append((left_post, left_in))
# 分割右子树的后序和中序
right_size = len(inord) - root_idx - 1
if right_size > 0:
right_post = post[left_size:-1]
right_in = inord[root_idx+1:]
queue.append((right_post, right_in))
return ''.join(result)
print(bfs_traversal(post_order, in_order))
- Cpp
#include <bits/stdc++.h>
using namespace std;
// 使用广度优先搜索实现层序遍历
string bfsTraversal(string postOrder, string inOrder) {
string result = "";
queue<pair<string, string>> q;
// 初始将整个树的
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记
查看2道真题和解析