多叉树的递归/层序遍历

简介: 多叉树是二叉树的扩展,节点可有多个子节点。遍历方式与二叉树类似,DFS无中序位置,BFS通过队列实现,支持按层遍历并记录深度,代码结构清晰,易于扩展。

一句话总结
多叉树结构就是 二叉树结构 的延伸,二叉树是特殊的多叉树。森林是指多个多叉树的集合。
多叉树的遍历就是 二叉树遍历 的延伸。
二叉树的节点长这样,每个节点有两个子节点:
多叉树的节点长这样,每个节点有任意个子节点:
就这点区别,其他没了。
递归遍历(DFS)
对比二叉树的遍历框架看多叉树的遍历框架吧:
唯一的区别是,多叉树没有了中序位置,因为可能有多个节点嘛,所谓的中序位置也就没什么意义了。
层序遍历(BFS)
多叉树的层序遍历和 二叉树的层序遍历 一样,都是用队列来实现,无非就是把二叉树的左右子节点换成了多叉树的所有子节点。所以多叉树的层序遍历也有三种写法,下面一一列举。
写法一
第一种层序遍历写法:
写法二
第二种能够记录节点深度的层序遍历写法:
Java
运行代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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++;
}

}
写法三
第三种能够适配不同权重边的写法:
Java
运行代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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));
    }
}

}

相关文章
|
机器学习/深度学习 数据可视化 算法
机器学习-可解释性机器学习:随机森林与fastshap的可视化模型解析
机器学习-可解释性机器学习:随机森林与fastshap的可视化模型解析
1791 1
|
算法
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
769 0
|
前端开发 JavaScript 测试技术
从零开始搭建react+typescript+antd+redux+less+vw自适应项目
从零开始搭建react+typescript+antd+redux+less+vw自适应项目
512 0
|
3月前
|
人工智能 自然语言处理 API
MiniMax M2.1开源:多语言编程SOTA,为真实世界复杂任务而生
MiniMax正式开源M2.1模型,全面提升多语言编程、办公自动化与原生App开发能力,支持WebDev、3D渲染、Agent工具链等复杂任务,性能媲美Claude Opus,免费开放体验。
1318 3
MiniMax M2.1开源:多语言编程SOTA,为真实世界复杂任务而生
|
监控 Java
Java中的内存泄漏分析与排查技巧
Java中的内存泄漏分析与排查技巧
|
算法 搜索推荐 C语言
C语言进行学生成绩排序(选择排序)
用C语言进行学生成绩排序,主要包括简单选择排序和堆排序,含源代码。
861 1
C语言进行学生成绩排序(选择排序)
|
存储 机器学习/深度学习
【数据结构】什么是二叉树?
【数据结构】什么是二叉树?
647 3
【数据结构】什么是二叉树?
|
Java
如何排查Java内存泄露(内附各种排查工具介绍)
今天刚刚才加一个故障review会议, 故障非常典型, 在google也可以找到相似案例介绍。 在排查问题的过程中,使用了大量的工具, 发现有问题的地方还不只一个,总结一下. (本篇文章不会重点描述案例本身,重点会介绍个人对java内存泄露问题的排查思路和各种工具的使用)。
22481 0
|
安全 Java Spring
springboot @Resource、@AutoWaire的用法实战
【4月更文挑战第3天】在Spring Boot中,@Autowired和@Resource注解都用于自动注入依赖,但它们在底层工作方式和使用的场合上存在一些差异。理解这些差异有助于更有效地使用Spring框架。
978 1
|
前端开发 JavaScript 网络协议
【JavaScript技术专栏】WebSockets在JavaScript中的应用
【4月更文挑战第30天】WebSocket是为解决HTTP协议在实时通信上的局限而诞生的技术,提供全双工、持久连接的通信方式,适合在线聊天、实时游戏等场景。JavaScript中的WebSocket API使浏览器与服务器能建立持久连接,通过事件处理连接、发送/接收数据及错误。相较于AJAX轮询和长轮询,WebSockets更高效、实时,是现代Web实时通信的优选。
247 0