每日学习一个数据结构-树

文章目录

    • 树的相关概念
      • 一、树的定义
      • 二、树的基本术语
      • 三、树的分类
      • 四、特殊类型的树
      • 五、树的遍历
      • 六、树的应用场景
    • 树的遍历
      • 一、前序遍历
      • 二、中序遍历
      • 三、后序遍历
      • 使用java代码实现遍历
      • 总结

树的相关概念

树是一种重要的非线性数据结构,在计算机科学中有着广泛的应用。以下是对树的相关概念的详细说明:

一、树的定义

树是由n(n≥0)个节点组成的有限集合。当n=0时,称为空树;当n>0时,为非空树。在非空树中,有且仅有一个特定的节点被称为根(root),其余节点可分为m(m>0)个互不相交的有限集T1, T2, …, Tm,其中每一个集合本身又是一棵树,并且被称为根的子树(Subtree)。

二、树的基本术语

  1. 节点(Node):包含一个数据元素及若干指向其子树的分支。
  2. 结点的度(Degree of a Node):一个节点拥有的子树数目。
  3. 树的度(Degree of a Tree):树中所有节点度的最大值。
  4. 叶子节点(Leaf Node):度为零的节点,也称为终端节点。
  5. 分支节点(Branch Node):度大于零的节点,也称为非终端节点。
  6. 路径(Path):由从根节点到某一节点所经分支和节点构成的序列。
  7. 路径的长度:是路径上所经过的边的个数。
  8. 节点的层次(Level of a Node):从根节点到该节点所经过的路径长度加1。根节点位于第1层。
  9. 树的深度(Depth of a Tree):树中叶子节点具有的最大层次数。
  10. 树的宽度(Width of a Tree):整棵树中某一层中最多的节点数。

三、树的分类

  1. 有序树(Ordered Tree):如果将树中节点的各子树看成从左至右是有次序的(即不能互换),则称该树为有序树。与之相对的是无序树,其中子树的顺序不重要。
  2. 二叉树(Binary Tree):每个节点最多有两个子树的树结构。二叉树具有一些特殊的性质,如满二叉树、完全二叉树等。
  3. m叉树:每个节点最多有m个子树的树结构。

四、特殊类型的树

  1. 满二叉树:除最后一层外,每一层上的所有节点都有两个子节点,且最后一层上的节点都靠左对齐的树。
  2. 完全二叉树:一棵二叉树,除最后一层外,每一层上的节点数均达到最大值,并且最后一层上的节点都靠左对齐的树。
  3. 平衡二叉树(AVL树):一种特殊的二叉查找树,它的任意节点的左右子树的高度差的绝对值不超过1。
  4. 红黑树(Red-Black Tree):一种自平衡的二叉查找树,它的节点是红色或黑色的,并且满足一系列额外的性质来保持树的平衡。

五、树的遍历

树的遍历是指按照某种规则访问树中的所有节点,使得每个节点被访问且仅被访问一次。常见的遍历方法包括前序遍历、中序遍历和后序遍历等。

六、树的应用场景

  1. 文件系统:使用树形结构来组织和管理文件和目录。
  2. 域名解析系统:采用层次式树形结构来组织和管理域名。
  3. 编译器:使用树形结构(如语法树)来表示源代码的结构和语义。
  4. 决策树:一种常用的机器学习算法,使用树形结构来表示决策过程。
    综上所述,树是一种重要的数据结构,具有广泛的应用场景和丰富的性质。了解树的基本概念、分类、特殊类型、遍历方法和应用场景,有助于更好地理解和应用树这种数据结构。

树的遍历

树的遍历是树这种数据结构的基本操作之一,它指的是按照某种规则访问树中的所有节点,并且每个节点仅访问一次。树的遍历主要有三种方式:前序遍历(也称为先序遍历)、中序遍历、后序遍历(也称为后续遍历)。以下是这三种遍历方式的详细描述:
树结构

一、前序遍历

  • 遍历顺序:先访问根节点,然后遍历左子树,最后遍历右子树。
  • 特点:在第一次遍历到节点时就执行操作。一般只是想遍历执行操作(或输出结果)可选用前序遍历。
  • 递归实现:对于当前节点,首先访问该节点,然后递归地对左子树进行前序遍历,最后递归地对右子树进行前序遍历。
  • 示例:假设有一棵树,根节点为A,左子节点为B,右子节点为C,B的左子节点为D,右子节点为E,C的右子节点为F。那么前序遍历的顺序为A→B→D→E→C→F。

二、中序遍历

  • 遍历顺序:先遍历左子树,然后访问根节点,最后遍历右子树。
  • 特点:对于二分搜索树(BST),中序遍历的操作顺序(或输出结果顺序)是符合从小到大(或从大到小,取决于BST的排序规则)顺序的。故要遍历输出排序好的结果需要使用中序遍历。
  • 递归实现:对于当前节点,首先递归地对左子树进行中序遍历,然后访问该节点,最后递归地对右子树进行中序遍历。
  • 示例:继续以上述树为例,中序遍历的顺序为D→B→E→A→C→F。

三、后序遍历

  • 遍历顺序:先遍历左子树,然后遍历右子树,最后访问根节点。
  • 特点:执行操作时,肯定已经遍历过该节点的左右子节点。故适用于要进行破坏性操作的情况,比如删除所有节点。
  • 递归实现:对于当前节点,首先递归地对左子树进行后序遍历,然后递归地对右子树进行后序遍历,最后访问该节点。
  • 示例:继续以上述树为例,后序遍历的顺序为D→E→B→F→C→A。

使用java代码实现遍历

在Java中,我们可以通过递归或迭代的方式来实现树的三种遍历方式:前序遍历、中序遍历和后序遍历。以下是一个简单的基于二叉树的实现示例:
首先,我们定义一个二叉树节点的类:

class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}

接下来,我们分别实现前序遍历、中序遍历和后序遍历的递归方法:

public class BinaryTreeTraversal {// 前序遍历public void preorderTraversal(TreeNode root) {if (root == null) {return;}System.out.print(root.val + " "); // 访问根节点preorderTraversal(root.left);    // 遍历左子树preorderTraversal(root.right);   // 遍历右子树}// 中序遍历public void inorderTraversal(TreeNode root) {if (root == null) {return;}inorderTraversal(root.left);     // 遍历左子树System.out.print(root.val + " "); // 访问根节点inorderTraversal(root.right);    // 遍历右子树}// 后序遍历public void postorderTraversal(TreeNode root) {if (root == null) {return;}postorderTraversal(root.left);    // 遍历左子树postorderTraversal(root.right);   // 遍历右子树System.out.print(root.val + " "); // 访问根节点}public static void main(String[] args) {// 创建一个简单的二叉树//       1//      / \//     2   3//    / \//   4   5TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);BinaryTreeTraversal traversal = new BinaryTreeTraversal();System.out.print("前序遍历: ");traversal.preorderTraversal(root);System.out.println();System.out.print("中序遍历: ");traversal.inorderTraversal(root);System.out.println();System.out.print("后序遍历: ");traversal.postorderTraversal(root);System.out.println();}
}

在这个示例中,我们创建了一个简单的二叉树,并分别调用了前序遍历、中序遍历和后序遍历的方法。每种遍历方法都会按照相应的顺序打印出节点的值。

请注意,这个示例使用了递归的方法来实现遍历。对于大型树结构,递归可能会导致栈溢出。在这种情况下,你可以考虑使用迭代的方法(例如使用栈或队列)来实现遍历。不过,对于大多数常见的应用场景,递归方法已经足够高效和易于理解。

总结

  • 访问时机:三种遍历方式的主要区别在于访问根节点的时机不同。在前序遍历中,根节点在左、右子节点之前被访问;在中序遍历中,根节点在左、右子节点之间被访问;在后序遍历中,根节点在左、右子节点之后被访问。
  • 应用场景:根据具体问题的需求选择合适的遍历方式。例如,如果只是想遍历执行操作(或输出结果),可以选择前序遍历;如果需要得到排序好的输出结果(特别是在二分搜索树中),可以选择中序遍历;如果需要进行破坏性操作(如删除节点),可以选择后序遍历。

在实际应用中,还可以根据具体需求对遍历方式进行适当的修改或扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++IO流

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 CIO流 收录于专栏 [C进阶学习] 本专栏旨在分享学习C的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. C语言的输入与输出 2. 流是什…

(PyTorch) 深度学习框架-介绍篇

前言 在当今科技飞速发展的时代,人工智能尤其是深度学习领域正以惊人的速度改变着我们的世界。从图像识别、语音处理到自然语言处理,深度学习技术在各个领域都取得了显著的成就,为解决复杂的现实问题提供了强大的工具和方法。 PyTorch 是一个…

C语言基础(7)之操作符(1)(详解)

目录 1. 各种操作符介绍 1.1 操作符汇总表 2. 移位操作符 2.1 移位操作符知识拓展 —— 原码、反码、补码 2.2 移位操作符讲解 2.2.1 右移操作符 ( >> ) 2.2.2 左移操作符 ( << ) 3. 位操作符 3.1 & (按位与) 3.2 | (按位或) 3.3 ^ (按位异或) 3.4…

深度学习每周学习总结J1(ResNet-50算法实战与解析 - 鸟类识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&#xff0c;学习率&a…

Python 解析 html

一、场景分析 假设有如下 html 文档&#xff1a; 写一段 python 脚本&#xff0c;解析出里面的数据&#xff0c;包括经度维度。 <div classstorelist><ul><li lng"100.111111" lat"10.111111"><h4>联盟店1</h4><p>…

【C语言】数组练习

【C语言】数组练习 练习1&#xff1a;多个字符从两端移动&#xff0c;向中间汇聚练习2、二分查找 练习1&#xff1a;多个字符从两端移动&#xff0c;向中间汇聚 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 练习2、二分查找 在⼀个升序的数组中查找指…

--- java数据结构 map set ---

java中map 和 set的底层实现是通过搜索树和哈希函桶来实现 搜索树 二叉搜索树有叫二叉排序树 他具有以下的特点 若存在左节点&#xff0c;那么他左节点的值一定小于根节点 若存在右节点&#xff0c;那么他右节点的值一定大于根节点 它的左右子树也是搜索树 对他进行中序…

Oracle架构之物理存储中各种文件详解

文章目录 1 物理存储1.1 简介1.2 数据文件&#xff08;data files&#xff09;1.2.1 定义1.2.2 分类1.2.2.1 系统数据文件1.2.2.2 撤销数据文件1.2.2.3 用户数据文件1.2.2.4 临时数据文件 1.3 控制文件&#xff08;Control files&#xff09;1.3.1 定义1.3.2 查看控制文件1.3.3…

大数据与人工智能:基础与应用的多维思考

大数据与人工智能&#xff1a;基础与应用的多维思考 前言一、时代定位与发展方向二、人工智能的本质与学科融合三、大数据和人工智能的构成要素与大众需求四、计算机系统结构与基础软件的重要性五、研究途径与领域知识的作用六、发展的态度与责任 前言 当下&#xff0c;大数据…

分布式学习02-CAP理论

文章目录 CAP三指标一致性可用性分区容错性 CAP不可能三角P存在的必要性CP理论AP理论 CAP理论对分布式系统的特性做了高度抽象&#xff0c;将其抽象为一致性、可用性、分区容错性。 并对特征间的冲突做了总结&#xff1a;CAP不可能三角。 CAP三指标 一致性&#xff08;Consis…

Windows环境Apache httpd 2.4 web服务器加载PHP8:Hello,world!

Windows环境Apache httpd 2.4 web服务器加载PHP8&#xff1a;Hello&#xff0c;world&#xff01; &#xff08;1&#xff09;首先需要安装apache httpd 2.4 web服务器&#xff1a; Windows安装启动apache httpd 2.4 web服务器-CSDN博客文章浏览阅读222次&#xff0c;点赞5次&…

Git 下载及安装超详教程(2024)

操作环境&#xff1a;Win 10、全程联网 一、什么是Git&#xff1f; Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 创立&#xff0c;用于有效、高速地处理从小到大的项目版本管理。Git 是目前世界上最流行的版本控制系统&#xff0c;被广泛用于软件开发中…

ECCV 2024 | 融合跨模态先验与扩散模型,快手处理大模型让视频画面更清晰!

计算机视觉领域顶级会议 European Conference on Computer Vision&#xff08;ECCV 2024&#xff09;将于9月29日至10月4日在意大利米兰召开&#xff0c;快手音视频技术部联合清华大学所发表的题为《XPSR: Cross-modal Priors for Diffusion-based Image Super-Resolution》——…

安防监控/视频系统EasyCVR视频汇聚平台如何过滤134段的告警通道?

视频汇聚/集中存储EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为…

基于Zynq SDIO WiFi移植三(支持2.4/5G)

应用问题-WIFI作为AP-hostapd多次连接 设备作为WIFI热点时&#xff0c;连接出现了下述问题&#xff1a; 1 手机连接需要三次&#xff0c;三次都需要输入密码&#xff1b; 2 平板连接需要三次&#xff0c;三次都需要输入密码&#xff1b; 3 电脑连接需要一次&#xff0c;无感…

计算机视觉——图像修复综述篇

目录 1. Deterministic Image Inpainting 判别器图像修复 1.1. sigle-shot framework (1) Generators (2) training objects / Loss Functions 1.2. two-stage framework 2. Stochastic Image Inpainting 随机图像修复 2.1. VAE-based methods 2.2. GAN-based methods …

YOLOv11改进 | Conv篇 | YOLOv11引入SKConv

1. SKConv介绍 1.1 摘要:在标准卷积神经网络(CNN)中,每层中阿尔蒂神经元的感受野被设计为共享相同的大小。在神经科学界众所周知,视觉皮层神经元的感受野大小受到刺激的调制,这在构建CNN时很少考虑。我们在CNN中提出了一种动态选择机制,允许每个神经元根据输入信息的多…

[深度学习][python]yolov11+deepsort+pyqt5实现目标追踪

【算法介绍】 YOLOv11、DeepSORT和PyQt5的组合为实现高效目标追踪提供了一个强大的解决方案。 YOLOv11是YOLO系列的最新版本&#xff0c;它在保持高检测速度的同时&#xff0c;通过改进网络结构、优化损失函数等方式&#xff0c;提高了检测精度&#xff0c;能够同时处理多个尺…

【嵌入式软件-数据结构与算法】01-数据结构

摘录于老师的教学课程~~(*๓╰╯๓)~~内含链表、队列、栈、循环队列等详细介绍~~ 基础知识系列 有空再继续更~~~ 目录 【链表】 一、单链表 1、存储结构&#xff1a;带头结点的单链表 2、单链表结点类型的定义 3、创建单链表 1&#xff09;头插法 2&#xff09;尾插法 …

Python办公自动化之Word

在现代办公环境中&#xff0c;自动化无疑是提升工作效率的关键。特别是处理文档的工作&#xff0c;很多人可能花费大量时间在重复性任务上。那么&#xff0c;有没有一种方法可以让我们用 Python 来自动化 Word 文档的操作呢&#xff1f;今天&#xff0c;我们来聊聊如何用 Pytho…