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

server/2024/10/4 20:15:27/

文章目录

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

一、前序遍历

  • 遍历顺序:先访问根节点,然后遍历左子,最后遍历右子
  • 特点:在第一次遍历到节点时就执行操作。一般只是想遍历执行操作(或输出结果)可选用前序遍历。
  • 递归实现:对于当前节点,首先访问该节点,然后递归地对左子进行前序遍历,最后递归地对右子进行前序遍历。
  • 示例:假设有一棵,根节点为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.ppmy.cn/server/127092.html

相关文章

深入理解.NET中的委托与事件:实现灵活的事件驱动编程

好的&#xff0c;主人&#xff01;以下是关于.NET中委托和事件的详细博客内容。 深入理解.NET中的委托和事件 引言 在现代软件开发中&#xff0c;事件驱动编程是一种常见模式。为了实现这种模式&#xff0c;.NET框架提供了委托和事件这两种重要的概念。它们不仅促进了方法的灵…

鸿蒙harmonyos next flutter混合开发之开发package

​​​​​​ 创建 package flutter create --templatepackage mypackage package代码如下&#xff1a; 创建hello_world.dart ///HelloWorld返回hello world 拼接param class HelloWorld {String helloWorld(String param) > "hello world ${param}"…

回归预测合集|基于灰狼优化21个机器学习和深度学习的数据回归预测Matlab程序 多特征输入单输出

回归预测合集|基于灰狼优化21个机器学习和深度学习的数据回归预测Matlab程序 多特征输入单输出 文章目录 一、清单二、实验结果三、核心代码四、代码获取五、总结 一、清单 基于灰狼优化BP神经网络的数据预测Matlab程序GWO–BP 基于灰狼优化卷积神经网络的数据预测Matlab程序G…

shadcn-vue 快速开始

介绍 基于 Radix Vue 和 Tailwind CSS 构建的可重复使用的组件 一个由社区主导的非官方 Vue 版本的 shadcn/ui。虽然我们与 shadcn 没有正式的合作或联系&#xff0c;但在开始这个项目之前得到了作者本人的同意。创建这个项目的原因是 Vue 生态系统中缺乏类似的项目&#xff…

STM32 F1移植FATFS文件系统 USMART组件测试相关函数功能

STM32 F1移植FATFS文件系统 使用USMART调试组件测试相关函数功能 文章目录 STM32 F1移植FATFS文件系统 使用USMART调试组件测试相关函数功能前言部分主要相关代码# USMART介绍1. mf_scan_files 扫描磁盘文件2. mf_mount 挂载磁盘3. mf_open 打开文件4. mf_read 读数据内容5. mf…

PostgreSQL 17新特性merge语法增强

PostgreSQL 17 merge语法增强&#xff0c;支持 RETURNING 子句&#xff0c;可以返回新增、更新或者删除的数据行 参考官方文档 https://www.postgresql.org/docs/17/sql-merge.html 1、merge语法 [ WITH with_query [, ...] ] MERGE INTO [ ONLY ] target_table_name [ * ] …

春意融融:Spring Boot技术在“衣依”服装销售平台的应用

5系统详细实现 5.1 管理员模块的实现 5.1.1 商品信息管理 “衣依”服装销售平台的系统管理员可以管理员商品&#xff0c;可以对商品信息添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 商品信息管理界面 5.1.2 尺码信息管理 系统管理员可以对尺码进行添加&#xff0c;…

【源码+文档+调试讲解】基于微信小程序的医院医疗设备管理系统springboot

摘 要 相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低医院的运营人员成本&#xff0c;实现了医院医疗设备的标准化、制度化、程序化的管理&#xff0c;有效地防止了医院医疗设备的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及…