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

news2024/10/4 18:34:13

文章目录

    • 树的相关概念
      • 一、树的定义
      • 二、树的基本术语
      • 三、树的分类
      • 四、特殊类型的树
      • 五、树的遍历
      • 六、树的应用场景
    • 树的遍历
      • 一、前序遍历
      • 二、中序遍历
      • 三、后序遍历
      • 使用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   5
        TreeNode 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.coloradmin.cn/o/2188487.html

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

相关文章

Pikachu-File Inclusion-远程文件包含

远程文件包含漏洞 是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在,危害性会很大。但远程文件包含漏洞的利用条件较为苛刻;因此,在web应用系统的功能设计上尽量不要让前端用户直接传变…

【GT240X】【04】你必须知道的 50 多个 Linux 命令

文章目录 一、介绍二、五十个linux命令一览表三、50个命令详解四、结论 你必须知道的 50 多个 Linux 命令 一、介绍 你经常使用 Linux 命令?今天,我们将介绍 50 多个你必须知道的 Linux 命令。下面列出的命令是一些最有用和最常用的 Linux 命令&#x…

jmeter学习(5)定时

Jmeter之定时器_jmeter定时器-CSDN博客 Jmeter(十三) - 从入门到精通 - JMeter定时器 - 上篇(详解教程)-腾讯云开发者社区-腾讯云 (tencent.com) 定时器是在每个sampler之前执行的,无论定时器位置在sampler之前还是子节点下面当执行一个sam…

TypeScript 算法手册 【基数排序】

文章目录 1. 基数排序简介1.1 基数排序定义1.2 基数排序特点 2. 基数排序步骤过程拆解2.1 找出数组中的最大值2.2 从最低位开始,对每一位进行计数排序2.3 对某一位数进行计数排序2.4 将排序结果复制回原数组 3. 基数排序的优化3.1 处理负数3.2 字符串排序案例代码和…

Go语言实现随机森林 (Random Forest)算法

在 Go 语言中实现随机森林(Random Forest)算法通常涉及以下几个步骤: 数据准备:将数据集分为训练集和测试集,确保数据格式适合算法使用。 决策树的构建:随机森林是由多个决策树构成的,首先需要…

MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置

MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置 目录 MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置一、MySQL 软件的下载二、安装 MySQL三、配置 MySQL1、配置环境变量2、安装并启动 MySQL 服务3、设置 MySQL 字符集4、为 root 用户设置登录密码 一…

使用前端三剑客实现一个备忘录

一,界面介绍 这个备忘录的界面效果如下: 可以实现任务的增删,并且在任务被勾选后会被放到已完成的下面。 示例: (1),增加一个任务 (2),勾选任务 &#xff…

【知乎直答】批量多线程生成原创文章软件-AI智能搜索聚合

【知乎直答】批量多线程生成原创文章软件介绍: 1、知乎发布的全新AI产品“知乎直答”是其AI搜索功能的产品化成果,旨在提升用户的提问、搜索体验以及结果生成和归纳的质量。 2、数据基础:该产品基于知乎平台上的真实问答数据及全网高质量问答…

Chromium 中前端js XMLHttpRequest接口c++代码实现

在JavaScript中发出HTTP请求的主要方式包括&#xff1a;XMLHttpRequest对象、Fetch API、Axios库和各种其他的HTTP客户端库。 本人主要分析下XMLHttpRequest接口在c中对应实现 一、上前端代码 <!DOCTYPE html> <html lang"en"> <head> <meta…

Go基础学习11-测试工具gomock和monkey的使用

文章目录 基础回顾MockMock是什么安装gomockMock使用1. 创建user.go源文件2. 使用mockgen生成对应的Mock文件3. 使用mockgen命令生成后在对应包mock下可以查看生成的mock文件4. 编写测试代码5. 运行代码并查看输出 GomonkeyGomonkey优势安装使用对函数进行monkey对结构体中方法…

Marp精华总结(二)进阶篇

概述 这是Marp精华总结的第二篇&#xff0c;主要补充第一篇未提到的一些内容。 系列目录 Marp精华总结&#xff08;一&#xff09;基础篇Marp精华总结&#xff08;二&#xff09;进阶篇Marp精华总结&#xff08;三&#xff09;高级篇 自适应标题 通过在标题行中插入<!-…

历经十年/头发都快掉光/秘钥生成器终极版/机器码/到期功能限制/运行时间限制/日期防篡改/跨平台

一、项目介绍 1.0 前言说明 标题一点都不夸张&#xff0c;从第一版的秘钥生成器到今天这个版本&#xff0c;确实经历了十年的时间&#xff0c;最初的版本做的非常简陋&#xff0c;就是搞了个异或加密&#xff0c;控制运行时间&#xff0c;后面又增加设备数量的控制&#xff0…

JavaFX加载fxml文件几种方法

环境&#xff1a;idea&#xff0c;maven创建JavaFX工程 工程目录如下&#xff1a; MusicPlayer.java package cn.com;import java.io.IOException;import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.geometry.Insets; import javafx.geo…

目标检测 Deformable DETR(2021)详细解读

文章目录 前言整体网络架构可变形注意力模块backbone生成多尺度特征多尺度位置编码prediction heads两个变体 前言 为解决DETR attention的计算量大导致收敛速度慢、小目标检测效果差的问题&#xff1a;提出了Deformable Attention&#xff0c;其注意力模块只关注一个query周围…

ML 系列: (10)— ML 中的不同类型的学习

一、说明 我们之前将机器学习方法分为三类&#xff1a;监督学习、无监督学习和强化学习。机器学习方法可以分为不同的类型&#xff0c;我们将在下面讨论最重要的类型。 二、懒惰学习与急切学习 预先学习的工作原理是使用训练数据构建模型&#xff0c;然后使用此模型评估测试数据…

STM32F103C8----3-3 蜂鸣器(跟着江科大学STM32)

一&#xff0c;电路图 &#xff08;接线图&#xff09; 面包板的的使用请参考&#xff1a;《面包板的使用_面包板的详细使用方法-CSDN博客》 二&#xff0c;目的/效果 3-3 蜂鸣器 三&#xff0c;创建Keil项目 详细参考&#xff1a;《STM32F103C8----2-1 Keil5搭建STM32项目模…

MySQL 中的 EXPLAIN 命令详解

在 MySQL 数据库中&#xff0c;EXPLAIN命令是一个非常强大的工具&#xff0c;它可以提供关于 SQL 查询执行计划的关键信息。理解这些信息对于优化查询性能至关重要。本文将详细介绍 MySQL 中的EXPLAIN命令提供的关键信息。 一、什么是 EXPLAIN 命令 EXPLAIN命令用于获取 MySQ…

Java多态(向上转型、动态绑定)+结合题目理解原理

第一次尝试使用markdowm写博客哈 文章目录 1.多态的引入2.重写和重载3.避免在构造方法里面去调用重写4.向上转型和向下转型5.让你真正明白什么是多态6.通过一些习题进行理解 1.多态的引入 首先说一下&#xff0c;这个想要使用多态需要我们满足的条件&#xff0c;然后具体的进行…

进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解

目录 一、冯诺依曼体系结构1、概念2、硬件层面的数据流3、关于冯诺依曼的知识点强调4、CPU 工作原理5、补充&#xff08;CPU 和寄存器、高速缓存以及主存之间的关系&#xff09; 二、操作系统&#xff08;Operating System&#xff09;1、概念2、定位3、设计 OS 的目的4、如何理…