【数据结构】树与森林(一)

简介: 树与森林

5.6.1 转换概述


  • 树与二叉树之间、森林与二叉树之间可以相互转换,而且这种转换是一一对应的。

5.6.2 树转换成二叉树


  • 树转换成二叉树可归纳3步骤:加线、删线、旋转
  1. 加线:将树中所有相邻的兄弟之间加一条连线。
  2. 删线:对树中的每一个结点,只保留它与第1个孩子结点之间的连线,删去它与其他孩子结点之间的连线。
  3. 旋转:以树的根结点为轴心,将树平面顺时针旋转一定角度并做适当的调整,使得转化后所得二叉树看起来比较规整。

image.png

  • 由树转换成的二叉树永远是一棵根结点的右子树为空的二叉树。

5.6.3 二叉树转换成树


  • 二叉树转换成树是树转换二叉树的逆过程。
  • 树转换成二叉树可归纳3步骤:加线、删线、旋转

image.png

image.png

5.6.4 森林与二叉树互转


  • 森林是由若干树组成,任何一棵树和树对应的二叉树其右子树一定是空的。
  • 根据这个规律可以得到森林转化成二叉树的方法:
  1. 将森林中每棵树转化成二叉树。
  2. 按照森林的先后顺序,将一颗二叉树视为前一棵二叉树的右子树依次链接起来,从而构成一颗二叉树

image.png

  • 将二叉树转化成森林正好是这个过程相反。

image.png

5.6.5 树的存储结构


  • 树的4种链式存放方式:
  1. 双亲链表存储结构
  2. 孩子链表存储结构
  3. 双亲孩子链表存储结构
  4. 孩子兄弟链表存储结构(重点掌握)

1)双亲链表存储结构

  • 以一组地址连续的存储单元存放树中的各个结点,每个结点有两个域:
  • 数据域:用于存放树中该结点的值。
  • 指针域:用于存放该结点的双亲结点在存储结构中的位置。

image.png

  • 优点:查找一个指定结点的双亲结点非常容易。
  • 缺点:查找指定结点的孩子结点,需要扫描整个链表。

2)孩子链表存储结构

  • 以一组地址连续的存储单元来存放树中的各个结点,每一个结点有两个域
  • 数据域:存放该结点的值
  • 指针域:用于存放该结点的孩子链表的头指针。

image.png

  • 优点:便于实现查找树中指定结点的孩子结点
  • 缺点:不便于查找指定结点的双亲结点

3)双亲孩子链表存储结构

  • 与孩子链表存储结构类似,以一组地址连续的存储单元来存放树中的各个结点,每一个结点有三个域
  • 数据域:存放该结点的值
  • 父指针域:用于存放双亲结点在数组中的位置
  • 子指针域:用于存放该结点的孩子链表的头指针。

image.png

4)孩子兄弟链表存储结构(重点掌握)

  • 孩子兄弟链表存放,又称为“左子/右兄”二叉链式存储结构。
  • 左指针:指向该结点的第一个孩子
  • 右指针:指向该结点的右邻兄弟

image.png

结点类publicclassCSTreeNode {
publicObjectdata;                         //结点的数据域publicCSTreeNodefirstChild, nextsibling;   //左孩子、右兄弟}

5.6.6 树的遍历


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

1)先根遍历

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

image.png

先根遍历序列:

ABEFCDGHIJK

publicvoidpreRootTraverse(CSTreeNodeT) {
if(T!=null) {
System.out.print(T.data);
preRootTraverse(T.firstChild);  //先根遍历树中根节点的第一个子树preRootTraverse(T.nextsibling); //先根遍历树中根节点的其他子树    }
}

2)后根遍历

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

后根遍历序列:

EFBCIJKHGDA

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


相关文章
|
1月前
|
算法
数据结构之博弈树搜索(深度优先搜索)
本文介绍了使用深度优先搜索(DFS)算法在二叉树中执行遍历及构建链表的过程。首先定义了二叉树节点`TreeNode`和链表节点`ListNode`的结构体。通过递归函数`dfs`实现了二叉树的深度优先遍历,按预序(根、左、右)输出节点值。接着,通过`buildLinkedList`函数根据DFS遍历的顺序构建了一个单链表,展示了如何将树结构转换为线性结构。最后,讨论了此算法的优点,如实现简单和内存效率高,同时也指出了潜在的内存管理问题,并分析了算法的时间复杂度。
52 0
|
2月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
123 64
|
27天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
53 5
|
1月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
87 16
|
1月前
|
算法
数据结构之文件系统模拟(树数据结构)
本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。
53 0
|
2月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
32 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
2月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
2月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(三)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
2月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(二)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
2月前
|
存储
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(一)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解