【数据结构】树的遍历、森林的遍历

简介: 【数据结构】树的遍历、森林的遍历

🐋树的遍历


树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次。


树可被看成是由树的根结点和根结点的所有子树所构成的森林两部分组成。


树的遍历主要有:先根遍历、后根遍历、层次遍历。


🌈 先根遍历


若树为非空,则


访问根节点


从左到右依次先根遍历根节点的每一颗子树。


6f90de5a579b45d39ebc8e3d2b3478c2.png


先根遍历序列:ABEFCDGHIJK

//先根遍历递归算法
public void preRootTraverse(CSTreeNode T) {
    if(T != null) {
        System.out.print(T.data);
        preRootTraverse(T.firstChild);  //先根遍历树中根节点的第一个子树
        preRootTraverse(T.nextsibling); //先根遍历树中根节点的其他子树
    }
}

🌈 后根遍历

  • 若树为非空,则
  1. 从左到右依次后根遍历根节点的每一棵子树
  2. 访问根节点

如上图:

后根遍历序列:EFBCIJKHGDA

public void postRootTraverse(CSTreeNode t) {
    if(T != null) {
        postRootTraverse(T.firstChild);   //后根遍历树中根节点的第一个子树
        System.out.print(T.data);     //访问数的根节点
        postRootTraverse(T.nextsibling);  //后根遍历树中根节点的其他子树
    }
}

🌈 层次遍历

  • 若树为非空,则从根节点开始,从上到下依次访问每一层的各个结点,在同一层中的结点,则按从左到右的顺序依次进行访问。

层次遍历序列:ABCDEFGHIJK

public void levelTraverse(CSTreeNode T) {
    if(T != null) {
        LinkQueue L = new LinkQueue();    //构建队列
        L.offer(T);             //根节点入队列
        while(!L.isEmpty()) {     //队列不为空,处理根结点和左孩子
            for(T = L.poll() ; T != null ; T = T.nextsibling) {//依次处理兄弟(右子树)
                System.out.print(T.data + " ");
                if(T.firstChild != null) {  //第一个孩子结点非空入队列
                    L.offer(T.firstchild);
                }
            }
        }
    }
}

🐋 森林的遍历


森林由3部分组成:


森林中第一棵树的根节点


森林中第一棵树的子树森林


森林中其他树构成的森林。


森林的3中遍历:


先根遍历


后根遍历


层次遍历


🌲先根遍历


顾名思义,先根遍历就是把根节点放在最前面的遍历方法,就是根节点->第一子树森林->其他森林的顺序来进行遍历。


若森林不空,则可依下列次序进行遍历:


访问森林中第一棵树的根节点


先序遍历第一课树中的子树森林


先序遍历除去第一棵树之后剩余的树构成的森林。


也就是说:依次从左到右对森林中的每一颗树进行先根遍历。


2a11e7950ed246798c672a565f7cc428.png


先根遍历顺序是:ABCEDFGHIJKL


🌲后根遍历


顾名思义,后根遍历就是把根节点放在最后面的遍历方法,就是第一子树森林->其他森林->根节点的顺序来进行遍历。


若森林不空,则可依下列次序进行遍历:


后根遍历第一棵树中的子树森林


后根遍历除去第一棵树之后剩余的树构成的森林。


访问森林中第一棵树的根节点


也就是说:依次从左至右对森林中的每一棵树进行后根遍历。


2827b46860864b4588ed09d5553e43fd.png


后根遍历序列是:BECDAGFIKLJH


🌲层次遍历


顾名思义,层次遍历就是按照每一棵树的每一层的顺序来进行遍历。


若森林为非空,则按从左到右的顺序对森林中每一颗树进行层次遍历。


也就是说:依次从左至右对森林中的每一棵树进行层次遍历。


15e8a57969814e1882de2438e8d2d92c.png


层次遍历序列:ABCDEFGHIJKL


相关文章
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
467 3
 算法系列之数据结构-Huffman树
|
存储 自然语言处理 数据库
【数据结构进阶】AVL树深度剖析 + 实现(附源码)
在深入探讨了AVL树的原理和实现后,我们不难发现,这种数据结构不仅优雅地解决了传统二叉搜索树可能面临的性能退化问题,还通过其独特的平衡机制,确保了在任何情况下都能提供稳定且高效的查找、插入和删除操作。
954 19
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
623 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
567 12
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
318 10
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
732 3
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
583 5
|
数据采集 存储 算法
【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
910 0
|
算法
数据结构之文件系统模拟(树数据结构)
本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。
413 0
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
423 59

热门文章

最新文章