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

文章目录

    • 树的相关概念
      • 一、树的定义
      • 二、树的基本术语
      • 三、树的分类
      • 四、特殊类型的树
      • 五、树的遍历
      • 六、树的应用场景
    • 树的遍历
      • 一、前序遍历
      • 二、中序遍历
      • 三、后序遍历
      • 使用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 是一个…

大数据分析入门概述

大数据分析入门概述 本文旨在为有意向学习数据分析、数据开发等大数据方向的初学者提供一个学习指南,当然如果你希望通过视频课程的方式快速入门,B站UP主戴戴戴师兄的课程质量很高,并且适合初学者快速入门。本文的目的旨在为想要了解大数据但…

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…

vue3 父子组件调用

vue3 父子组件调用 父组件调用子组件方法 子组件使用defineExpose将方法抛出 父组件定义 function&#xff0c;子组件通过 defineExpose 暴露方法&#xff0c;父组件通过 ref 获取子组件实例&#xff0c;然后通过 ref 获取子组件方法。 // 父组件 <template><div>…

探索Cherry键盘的FN+F9游戏模式与Ctrl+Fn功能

简言 在电竞和日常办公领域&#xff0c;Cherry键盘以其卓越的按键反馈和耐用性而闻名。今天&#xff0c;我们将深入探讨Cherry键盘的两个独特功能&#xff1a;FNF9游戏模式和CtrlFn锁定功能。 介绍 FNF9&#xff1a;一键切换游戏模式 功能介绍&#xff1a; FNF9是Cherry键…

零基础编程从哪开始学?

目录 第一、零基础怎么学习编程&#xff1f;第二、什么书籍、教程或者博主比较好 第一、零基础怎么学习编程&#xff1f; 1. 确定目的而不是语言。 首先&#xff0c;你要知道你学习编程是为了什么目的&#xff0c; 或者说你学习编程的初心是什么&#xff1f; 可能你对游戏开发…

JMeter源码解析之JMeter命令行新增命令

JMeter源码解析之JMeter命令行新增命令 需求描述 需要新增一条命令&#xff0c;能够在JMeter命令行中能够展示输入对应的JMeter命令&#xff0c;能够展示对应的命令信息 查看命令效果如下&#xff1a; apache-jmeter-5.1\bin>jmeter --? Copyright © 1999-2024 The …

深度学习每周学习总结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>…

资源网站分享

云计算文档中心各个方向(云计算 大数据 路由器 交换机 无线 物联网 安全 光模块 智能管理与运维 移动通信 服务器 存储 PON ICG信息通信 EPCN网关 License Server 其他产品 智能终端 传输产品 云简网络 商用终端 ALGC SMB 产品)云计算-云计算产品-云计算解决方案-新华三集团-H3…

【2024】基于mysqldump的数据备份与恢复

基于mysqldump备份与恢复 mysqldump是一个用于备份 MySQL 数据库的实用工具。 它可以将数据库的结构&#xff08;如数据库、表、视图、存储过程等的定义&#xff09;和数据&#xff08;表中的记录&#xff09;导出为文本文件&#xff0c;这些文本文件可以包含 SQL 语句&#…

从 ElasticSearch 中删除数据的几种方式

在Elasticsearch中删除数据是一个常见的操作&#xff0c;它可以通过多种方式实现&#xff0c;以满足不同的应用场景和需求。以下是从Elasticsearch中删除数据的几种主要方式&#xff1a; 1. 删除索引&#xff08;Index&#xff09; 删除索引是Elasticsearch中删除数据的最彻底…

【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…

PostgreSQL 创建账号与数据库:从连接到权限配置的完整指南

PostgreSQL 创建账号与数据库&#xff1a;从连接到权限配置的完整指南 文章目录 PostgreSQL 创建账号与数据库&#xff1a;从连接到权限配置的完整指南一 使用 psql 连接数据库二 创建数据库和账号三 退出当前连接四 用新的账号登录连接五 运行 SQL 文件六 App 连接 本文详细讲…

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

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

分布式学习02-CAP理论

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

JS进阶 4——深浅拷贝、异常处理、节流防抖

JS进阶 4——深浅拷贝、异常处理、节流防抖 1.深浅拷贝 直接复制对象的问题 const obj {uname: xiao,age: 18}const o objo.age 20console.log(o) //原来对象的age也被彻底改变了console.log(obj)浅拷贝——内部引用仍然拷贝的是地址 拷贝对象&#xff1a;Object.assdin(…