多叉树的递归/层序遍历

简介: 多叉树是二叉树的扩展,每个节点可有多个子节点。遍历方式类似:递归遍历无中序概念;层序遍历用队列实现,可记录深度或适配加权边,代码结构与二叉树一致,仅子节点处理由左右变为列表遍历。

一句话总结
多叉树结构就是 二叉树结构 的延伸,二叉树是特殊的多叉树。森林是指多个多叉树的集合。
多叉树的遍历就是 二叉树遍历 的延伸。
二叉树的节点长这样,每个节点有两个子节点
class TreeNode {
int val;
TreeNode left;
TreeNode right;
}
多叉树的节点长这样,每个节点有任意个子节点:
class Node {
int val;
List children;
}
就这点区别,其他没了。
递归遍历(DFS)
对比二叉树的遍历框架看多叉树的遍历框架吧:
// 二叉树的遍历框架
void traverse(TreeNode root) {
if (root == null) {
return;
}
// 前序位置
traverse(root.left);
// 中序位置
traverse(root.right);
// 后序位置
}

// N 叉树的遍历框架
void traverse(Node root) {
if (root == null) {
return;
}
// 前序位置
for (Node child : root.children) {
traverse(child);
}
// 后序位置
}

唯一的区别是,多叉树没有了中序位置,因为可能有多个节点嘛,所谓的中序位置也就没什么意义了。
层序遍历(BFS)
多叉树的层序遍历和 二叉树的层序遍历 一样,都是用队列来实现,无非就是把二叉树的左右子节点换成了多叉树的所有子节点。所以多叉树的层序遍历也有三种写法,下面一一列举。
写法一
第一种层序遍历写法:
void levelOrderTraverse(Node root) {
if (root == null) {
return;
}
Queue q = new LinkedList<>();
q.offer(root);
while (!q.isEmpty()) {
Node cur = q.poll();
// 访问 cur 节点
System.out.println(cur.val);

    // 把 cur 的所有子节点加入队列
    for (Node child : cur.children) {
        q.offer(child);
    }
}

}
写法二
第二种能够记录节点深度的层序遍历写法:

void levelOrderTraverse(Node root) {
if (root == null) {
return;
}
Queue q = new LinkedList<>();
q.offer(root);
// 记录当前遍历到的层数(根节点视为第 1 层)
int depth = 1;

while (!q.isEmpty()) {
    int sz = q.size();
    for (int i = 0; i < sz; i++) {
        Node cur = q.poll();
        // 访问 cur 节点,同时知道它所在的层数
        System.out.println("depth = " + depth + ", val = " + cur.val);

        for (Node child : cur.children) {
            q.offer(child);
        }
    }
    depth++;
}

}
写法三
第三种能够适配不同权重边的写法:
class State {
Node node;
int depth;

public State(Node node, int depth) {
    this.node = node;
    this.depth = depth;
}

}

void levelOrderTraverse(Node root) {
if (root == null) {
return;
}
Queue q = new LinkedList<>();
// 记录当前遍历到的层数(根节点视为第 1 层)
q.offer(new State(root, 1));

while (!q.isEmpty()) {
    State state = q.poll();
    Node cur = state.node;
    int depth = state.depth;
    // 访问 cur 节点,同时知道它所在的层数
    System.out.println("depth = " + depth + ", val = " + cur.val);

    for (Node child : cur.children) {
        q.offer(new State(child, depth + 1));
    }
}

}

相关文章
|
23天前
|
SQL 人工智能 Linux
SQL Server 2025 正式版发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 正式版发布 - 从本地到云端的 AI 就绪企业数据库
185 1
SQL Server 2025 正式版发布 - 从本地到云端的 AI 就绪企业数据库
|
21天前
|
IDE Java 开发工具
Mac 安装 JDK 8u281(JDK-8u281-1.dmg)详细步骤(附安装包)
下载JDK-8u281安装包并双击DMG文件,打开PKG安装程序,按提示完成安装。安装过程中需同意协议并输入电脑密码。安装后可通过终端输入“java -version”检查版本,显示1.8.0_281即表示成功。适用于Mac系统开发环境配置。
|
1月前
|
机器学习/深度学习 人工智能 算法
水稻病害检测数据集(7000 张图片已划分)| AI 训练适用于目标检测任务
本数据集包含7000张已标注水稻病害图像,涵盖细菌性叶斑病、褐斑病和叶霉病三类常见病害,适用于目标检测任务。数据按8:1:1划分训练集、验证集与测试集,标注格式支持YOLO等主流模型,可直接用于AI训练与部署,助力智慧农业病害识别研究。
水稻病害检测数据集(7000 张图片已划分)| AI 训练适用于目标检测任务
|
1月前
|
人工智能 IDE 数据挖掘
Python安装 + 使用教程
本文介绍了Python的起源、应用领域及Windows系统下的安装与配置方法。涵盖办公自动化、数据分析、人工智能等实用场景,并详细演示下载、安装、环境变量设置及常见问题解决,帮助初学者快速上手Python编程。
603 3
|
1月前
|
人工智能 数据可视化 前端开发
震惊,Github开源,真正让程序员效率提升 90%的AI辅助工具来啦!!!
Claude Code Viewer 是一款开源浏览器工具,将 Claude Code 的终端日志可视化,支持会话管理、Git Diff 查看、文件预览与定时任务,实现远程交互与多项目导航,提升 AI 编程效率。
393 0
|
13天前
|
存储 Web App开发 前端开发
新手如何建站.新手建站的全流程
建站是通过整合域名、服务器等要素搭建可访问数字平台的过程,分自助建站、CMS系统和代码开发三类工具。核心流程包括需求规划、域名注册(实名认证)、服务器配置(国内需ICP备案),搭建后填充内容并测试优化,解析域名上线,做好后续维护。
147 10
|
14天前
|
存储 搜索推荐 JavaScript
医院随访管理系统源码开发,患者随访管理系统成品源码,智能随访系统源码,出院随访系统源码
医院随访管理系统源码,基于Java+Vue前后端分离架构,集成患者信息管理、智能随访计划、自动提醒、录音上传、数据统计等功能。支持个性化随访模板、科研随访、多级审核与数据分析,提升医院随访效率与患者满意度。
68 11
|
18天前
|
供应链 数据可视化 Java
云端SaaS诊所管理系统(java源码),实现挂号、开方、收费、发药全流程管理
云诊所SaaS系统,集患者管理、预约挂号、电子处方、智能诊断、药房进销存、财务统计于一体,支持模板调用、库存预警、多支付方式,实现诊疗全流程数字化管理,提升基层医疗效率。
104 13
|
23天前
|
供应链 JavaScript 安全
B/S云门诊系统源码,java云诊所源码,基于Spring Boot、Vue.js构建
云端SaaS架构云门诊系统,基于Spring Boot+Vue开发,支持医保结算,集成预约挂号、诊疗、收费、库存、会员管理等功能,适用于各类基层医疗机构,可打包为C/S桌面应用,支持外接设备免安装配置。
106 10
|
1月前
|
SQL 人工智能 自然语言处理
Spring Boot + GPT:我做了一个能自己写 SQL 的后端系统
本文介绍如何基于Spring Boot与GPT(或国产大模型如通义千问、DeepSeek)构建智能后端系统,实现自然语言自动生成SQL。系统采用分层架构,集成AI语义理解、SQL安全验证与执行功能,提升开发效率并降低数据查询门槛,兼具安全性与可扩展性。
161 7