树型结构——二叉数

news2025/1/10 12:05:12

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

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题还有层序遍历我放在下一章来讲解。

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

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

相关文章

【人工智能原理自学】循环:序列依赖问题

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解循环&#xff1a;序列依赖问题&#xff0c;一起卷起来叭&#xff01; 目录一、“序列”二、代码实现一、“序列” 数据除了在空间上可能出现关联性外&#xff0c;也可…

nodejs在线教学网上授课系统vue367

目 录 摘 要 I Abstracts II 目 录 III 第1章 绪论 1 1.1课题背景 1 1.2研究意义 1 1.3研究内容 2 第2章 技术介绍 1 2.1 相关技术 1 1、 node_modules文件夹(有npn install产生) 这文件夹就是在创建完项目后&#xff0c;cd到项目目录执行np…

基于nodejs+vue驾校预约网站管理系统

系统分为用户和管理员&#xff0c;教练三个角色 目 录 第1章 绪论 1 1.1课题背景 1 1.2 背景意义 1 1.3 研究的内容 2 第2章 相关技术 3 第3章 系统分析 5 3.1可行性分析 5 3.2系统性能分析 6 3.3系统流程分析 6 3.3.1操作流程 6 3.3.2信息添加…

Cadence PCB仿真使用Allegro PCB SI生成电源地噪声报告SSN Report及报告导读图文教程

🏡《Cadence 开发合集目录》   🏡《Cadence PCB 仿真宝典目录》 目录 1,概述2,生成报告3,报告导读4,总结1,概述 SSN报告等效的电源和地噪声源报告。本文简单介绍使用Allegro PCB SI生成SSN报告的方法,及其要点导读。 2,生成报告 第1步,选择需要生成报告的网络,…

【绝密】大厂笔试题

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前是C语言学习者 ✈️专栏&#xff1a;C语言刷题 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&…

微信支付账户更换实名认证微信钱包零钱余额还在吗?怎么更换微信钱包实名认证?

原文来源&#xff1a;https://www.caochai.com/article-4119.html 微信支付账户更换实名认证微信钱包零钱余额还在吗&#xff1f; 微信支付账户更换实名认证微信钱包的零钱余额将清空&#xff0c;因为更换微信钱包实名认证的前提条件是微信钱包零钱余额不能大于0元。所以&…

一周学习总结(2022.1.25)

文章目录前言本周任务完成情况1.《Vue.js的设计与实现》2.《计算机网络&#xff1a;自顶向下方法》3.组件库4.青训营笔记5.刷题总结前言 年前给自己定下了一组学习计划&#xff0c;安排了每天需要完成的事情。这里主要记录一下每周任务的完成情况。本周定制的任务主要围绕着《V…

DP初入门

目录 一、前言 二、DP概念 1、最少硬币问题 2、DP的两个特征 三、0/1背包&#xff08;最经典的DP问题&#xff09; 1、小明的背包1&#xff08;lanqiaoOJ题号1174&#xff09; 2、空间优化&#xff1a;滚动数组 1&#xff09;交替滚动 2&#xff09;自我滚动 一、前言…

C语言函数调用详解

所谓函数调用&#xff08;Function Call&#xff09;&#xff0c;就是使用已经定义好的函数。函数调用的一般形式为&#xff1a;functionName(param1, param2, param3 ...);functionName 是函数名称&#xff0c;param1, param2, param3 ...是实参列表。实参可以是常数、变量、表…

【Java开发】Spring Cloud 10 :Stream消息驱动

官方定义Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。它为一些供应商的消息中间件产品提供了个性化的自动化配置实现&#xff0c;Spirng Cloud Stream 本质上就是整合了 Spring Boot 和 Spring Integration&#xff0c;实现一套轻量级的消息驱动的微服…

Python内置包Tkinter的重要控件(下)

本文将接着介绍剩下的五个重要的控件&#xff0c;包括Canvas&#xff0c;Messagebox&#xff0c;Listbox&#xff0c;Checkbutton&#xff0c;Radiobutton。 目录 前言 控件 1. Canvas 2. Messagebox 3. Listbox 4. Radiobutton 5. Checkbutton 总结 前言 包括但不…

VBA提高篇_08 数据源类型判断 / 四舍五入

文章目录数据类型操作1. 数据类型判断2.数据类型转换2.1转换函数2.2 关于小数数据类型的四舍五入2.2.1 银行家舍入法2.2.2 Round()函数2.2.3 Int()函数数据类型操作 1. 数据类型判断 IsDate() 是否是日期类型 IsNumeric() 是否是数值类型 TypeName(x) 返回x 的数据类型的名称…

移动端特点和flex布局

移动端特点和flex布局移动端特点物理分辨率和逻辑分辨率视口视口标签二倍图百分比布局flex布局主轴对齐方式侧轴对齐方式伸缩比圣杯布局移动端特点 PC端/移动端不同 PC端 屏幕大&#xff0c;网页固定版心浏览器繁多&#xff0c;更多考虑兼容性问题。&#xff08;布局&#xf…

Gin+Vite实现单图上传

前言 参考文献&#xff1a;https://blog.csdn.net/heian_99/article/details/122447855 案例目的&#xff1a;实现前端上传图片并显示&#xff0c;后端保存图片&#xff1b; 技术&#xff1a;elementplus、axios、vue3、vite、gin 实现原理&#xff1a; 前端请求对应后端接口…

连通性1(Tarjan 理论版)

目录 一、无向图割点、桥、双连通分量 Tarjan 算法求割点和桥&#xff08;割边&#xff09; “割点”代码 边双和点双连通分量 边双连通分量 和 点双连通分量 的缩点 二、有向图强连通分量 1.有向图的弱连通与强连通 2.强连通分量 Kosaraju算法 Tarjan 算法&#xff08…

读书笔记:Python绘制三维图像 ← 斋藤康毅

下文给出了绘制函数 的 Python 代码。 很显然&#xff0c;这是一个三维图像。【绘制三维图像的Python代码】 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3Dfigplt.figure() axAxes3D(fig) x1np.arange(-3.0, 3.0, 0.1) x2np.…

python刷题-关于日期、正则表达式的题

目录标题1、计算日期范围内的所有日期2、将Unix时间戳转换为格式化日期3、计算日期数据周同比4、正则表达式判断字符串是否是日期5、从文本中提取手机号码 --正则表达式6、批量提取网页上的手机号码7、自动提取电子邮箱地址8、验证用户密码是否规范-re.findall9、提取商品价格1…

ELK简介

什么是ELKE: Elasticsearch全文搜索引擎L: logstash日志采集工具K: kibana ES的可视化工具ELK是当今业界非常流行的日志采集保存和查询的系统我们编写的程序,会有很多日志信息,但是日志信息的保存和查询是一个问题IDEA控制台是一个临时显示的位置,我们可以将它保存在文件中但是…

Jetpack架构组件库:Room

Room Room是一款轻量级orm数据库&#xff0c;本质上是一个基于SQLite之上的抽象层。它通过注解的方式提供相关功能&#xff0c;编译时自动生成实现Impl&#xff0c;相比纯 SQLite 的API使用方式更加简单。另外一个相比于SQLite API的优势是&#xff1a;它会在编译时检查 SQL 语…

SpringBoot+Vue项目在线视频教育平台

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…