树型结构——二叉数

2023-11-17

之前就说过我们的数据结构分为两种,分别是线性结构和非线性结构,我们今天要学的第一种线性结构就是树型结构。

1. 树型结构

树型结构并非我们熟悉的重点,所以在这里只做了解。

概念: 

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
 1. 有一个特殊的结点,称为根结点,根结点没有前驱结点
 2. 除根结点外,其余结点被分成M(M > 0)个互不相交的集合T1、T2、......、Tm,其中每一个集合Ti (1 <= i <=m) 又是一棵与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
 3. 树是递归定义的

比如生活中见到的树:

数据结构中的 “ 树 ” 和现实中的树有点区别,数据结构中的 “ 树 ” 是倒着树,我们自己动手画一棵:

 我们来看一看非树的情况:

 我们可以得到如下结论:

1. 子树是不相交的

2.除了根结点外,每个结点有且仅有一个父亲结点

3.一颗N个结点的树,有N - 1 个边(这个后面还会用到)

书上有的很多关于树的概念这里就不介绍了,可以直接看书。例如:

结点的度:一个结点含有子树的个数称为该结点的度;
树的度:一棵树中,所有结点度的最大值称为树的度;
叶子结点或终端结点:度为0的结点称为叶结点;
孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点;
等等。

1.2 树的表示形式

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,如:双亲表示法,孩子表示法、孩子双亲表示法、孩子兄弟表示法等等。我们这里就简单的了解其中最常用的孩子兄弟表示法。

代码示例:

class Node {
    int value; // 树中存储的数据
    Node firstChild; // 第一个孩子引用
    Node nextBrother; // 下一个兄弟引用
}

图示:

1.3 树的应用
 比如我们电脑文件管理就是一个树结构的:

2. 二叉树

我们上面的文件管理有多个子节点,我们统称为多叉树,当树的度不大于2时,我们称之为二叉树,例如:

 二叉树不仅仅是考试的重难点也是未来面试的一个重难点。

2.1 概念

一棵二叉树是结点的一个有限集合,该集合:
1. 或者为空
2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

 从上图可以看出:
1. 二叉树不存在度大于2的结点
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
注意:对于任意的二叉树都是由以下几种情况复合而成的:

 2.2 特殊的二叉树

1. 满二叉树: 一棵二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树。也就是说,如果一棵二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
2. 完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

关于二叉树的更多性质可以查看下图

 好了,了解以上知识,就算碰到二叉树的门槛了,关于二叉树的具体实现,还得接着往下看

3. 二叉树的实现

上代码:

class TreeNode {//结点的实现
        int val;//data域
        public TreeNode left;//左子节点的引用
        public TreeNode right;//右子节点的引用

        public TreeNode(int val) {
            this.val = val;
        }
}

每个结点都存在三个域,数据域和左右子节点,其叶子节点也存在左右子节点,只不过其左右子节点均为null,所以左右子节点均为null的也叫做叶子节点。

我们再来看看二叉树的概念:

1. 空树
2. 非空:根节点,根节点的左子树、根节点的右子树组成的

4. 二叉树的基本操作

在我们真正去实现二叉树的时候一般都是使用LinkedList去实现,我们模拟也是用LinkedList去模拟的。

我们的模拟主要有如下几个

// 获取树中节点的个数
int size(Node root);
// 获取叶子节点的个数
int getLeafNodeCount(Node root);
// 获取第K层节点的个数
int getKLevelNodeCount(Node root,int k);
// 获取二叉树的高度
int getHeight(Node root);
// 检测值为value的元素是否存在
Node find(Node root, int val);
//层序遍历
void levelOrder(Node root);
// 判断一棵树是不是完全二叉树
boolean isCompleteTree(Node root);

还有最最基础的前中后序遍历。

我们先来第一个前序遍历。

1. 前序遍历

思路如下:

我们简易的口诀就是根、左、右;如图:

我们用数字来表示路径,从最开始的根走,找到第二层的根并且把其根全部走完,再走左,把左全部走完最后走右,每一根左右下面都还有一层根左右。

动图表示:

 芝士代码:

 // 前序遍历
    void preOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        System.out.print(root.val + " ");
        preOrder(root.left);
        preOrder(root.right);
    };

2. 中序遍历

思路:

类似于前序遍历,但是我们的路径发生改变,路径为左、根、右。

每一层的左、根、右都还有左、根、右。

动图表示:

  芝士代码:

 // 中序遍历
    void inOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        inOrder(root.left);
        System.out.print(root.val+ " ");
        inOrder(root.right);
    };

3. 后序遍历

思路:

一样类似于前序遍历,但是我们的路径发生改变,路径为左、右、根。

每一层的左、右、根都还有左、右、根。

动图表示:

后序遍历

   芝士代码:

 // 后序遍历
    void postOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        postOrder(root.left);
        postOrder(root.right);
        System.out.print(root.val+ " ");
    };

当然拉我们做二叉树问题的大部分思路都是递归去解决,也有问题可以用其他方法解决,余下的二叉树模拟方法,包括一些oj题还有层序遍历我放在下一章来讲解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树型结构——二叉数 的相关文章

随机推荐

  • 【Fiddler抓包】Fiddler基础用法-基于Fiddler5中文汉化版

    Fiddler基础知识 Fiddler是强大的抓包工具 它的原理是以web代理服务器的形式进行工作的 使用的代理地址是 127 0 0 1 端口默认为8888 我们也可以通过设置进行修改 代理就是在客户端和服务器之间设置一道关卡 客户端先将
  • 基础连接已关闭解决办法

    最近微信公众号功能莫名其妙的出问题 在调腾讯和百度接口就出问题 也不知道哪里抽风 只要调用外部接口 POST或者GET提交 准备出错 提示基础连接已关闭 httpWebRequest请求错误 基础连接已经关闭 连接被意外关闭 研究很久很久
  • 不吹不黑 OpenHarmony会是一个伟大的操作系统吗

    1 前言 大家好 我叫连志安 目前是OpenHarmony社区的一位开发者 我在2020年华为的HDC上就开始接触OpenHarmony 至今1年多了 在回答标题这个问题之前 我想起一句话 先有结论 再做论证 结论是 我认为 OpenHar
  • 【PTA】团体程序设计天梯赛-练习集 L3题目总结(不全)

    模拟题 STL题 L3 002 特殊堆栈 两个vector L3 002 特殊堆栈 参考 include
  • Shader 中 SubShader Tags Pass的理解

    Shader 中 SubShader Tags Pass的理解 SubShader Tags RenderType Opaque Pass Tags LightMode UniversalForward HLSLPROGRAM ENDHLS
  • 完整的Apache+PHP8+MYSQL的配置

    1 下载Apache和PHP 下载Apache 地址 http www apachelounge com download 如下图 将下载的压缩包解压到某个文件夹 比如 D software 将解压后的文件夹重命名为Apache24 下载P
  • Flask笔记1

    Flask笔记 首先明确一下 要运行一个动态网页 我们需要 一个 Web 服务器来监听并响应请求 如果请求的是静态文件它就直接将其返回 如果是动态 url 它就将请求转交给 Web 应用 一个 Web 应用来动态处理请求 生成响应 其中 W
  • 可汗学院统计学笔记

    假设检验 假设检验和参数估计是统计推断里面两个重要的组成部分 两个知识点从不同方面来对统计推断做出阐述 参数估计是通过样本的统计量估计总体的参数 从而衍生出了点估计和区间估计 假设检验则是首先做出一个假设 进而验证这个假设的真实性 就比如说
  • 开心档之Git Gitee

    Git Gitee 大家都知道国内访问 Github 速度比较慢 很影响我们的使用 如果你希望体验到 Git 飞一般的速度 可以使用国内的 Git 托管服务 Gitee gitee com Gitee 提供免费的 Git 仓库 还集成了代码
  • 【Windows】你所使用的用户账户没有启用此任务的权限

    Windows 你所使用的用户账户没有启用此任务的权限 1 故障现象 有一台腾讯云的服务器更新补丁 更新后需要禁用自动重启 发生了以下报错 2 解决方法 2 1 下载pstools 工具下载地址 https learn microsoft
  • Dubbo源码解析:服务暴露与发现

    dubbo源码解析 服务暴露与发现 概述 dubbo是一个简单易用的RPC框架 通过简单的提供者 消费者配置就能完成无感的网络调用 那么在dubbo中是如何将提供者的服务暴露出去 消费者又是如何获取到提供者相关信息的呢 这就是本章我们要讨论
  • dubbo 项目既是提供方又是消费方,调用不到服务问题

    1 先查看服务提供者有没有注册 这里通过安装eclipse中的zookeeper插件 进行了查看 服务已经注册上了 2 注册上以后 查看调用者有没有在zookeeper中注册 此时通过查看 并没有 3 没有注册上 然后查看是否是配置哪里出了
  • vue cl3、vuex、vue-router、ant design vue、axios搭建一个简易的单页面应用

    源码码云 https gitee com ChinaCYZ zhengyekeji 在线演示地址 http cheyouzheng top test index html 找工作时 发现一套不错的前端机试题 分享给大家 之前都是使用原生JS
  • 主题模型的概述与Python实现

    主题模型的概述与Python实现 主题模型是一种用于发现文本数据中隐藏主题的统计模型 它可以帮助我们理解大规模文本数据集中的主题结构 并从中提取出关键信息 在本文中 我们将介绍主题模型的基本概念 并使用Python来实现一个简单的主题模型
  • linux应用之mysql8安装

    1 安装前工作 在安装前需要确定现在这个系统有没有 mysql 如果有那么必须卸载 在 centos7 自带的是 mariaDb 数据库 所以第一步是卸载数据库 查看mariadb数据库 rpm qa grep mariadb 卸载mari
  • Linux关闭防火墙命令(永久性关闭)

    抛开实际生产环境 个人平时练习的时候安装虚拟机可能遇到过很多坑就很烦 可能很大一部分原因都是防火墙没关掉哈哈哈哈所以建议永久性关闭防火墙 下面是CentOs7关闭防火墙的命令 1 查看防火状态 systemctl status firewa
  • vue3中的useAttrs和props的区别

    在vue3中 提供了一个 useAttrs 的方法 它接收到的参数一 prop中可以接收到的数据是基本一样的 如果我们想自已写一个组件 把 elementPlus 中的期中一个组件封装一下 可以这样做 1 新建一个 自定义组件 myBtnC
  • 图解 Dijkstra、Floyd、BellMan-Ford 最短路径算法

    文章目录 导言 一 迪杰斯特拉算法 Dijkstra 1 概述 2 算法描述 3 图片解释 4 Dijkstra算法实现 5 Dijkstra Heap算法实现 二 弗洛伊德算法 Floyd Warshall 1 概述 2 算法描述 3 算
  • PowerVM 的主要组成部分及概念

    PowerVM 是在基于 IBM POWER 处理器的硬件平台上提供的具有行业领先水平的虚拟化技术家族 它是 IBM Power System 虚拟化技术全新和统一的品牌 逻辑分区 微分区 Hypervisor 虚拟 I O 服务器 APV
  • 树型结构——二叉数

    之前就说过我们的数据结构分为两种 分别是线性结构和非线性结构 我们今天要学的第一种线性结构就是树型结构 1 树型结构 树型结构并非我们熟悉的重点 所以在这里只做了解 概念 树是一种非线性的数据结构 它是由n n gt 0 个有限结点组成一个