树的基本概念及二叉树

目录

一、树的基本概念

(1)树的结点

(2)度

(3)结点层次

(4)树的高度 

树的特点: 

二、二叉树

(1)满二叉树

(2)完全二叉树 

三、二叉树的存储 

(1)顺序存储

(2)链式存储 

四、二叉树的遍历

(1)前序遍历

(2)中序遍历 

 (3)后序遍历

 (4)层序遍历


树是一种非线性的数据结构,存储具有“一对多”关系特点元素的一种数据结构。例如:组织架构、图书目录、商品种类、热点搜索词等。

如图所示就是一个 树 ,对数据A来说,和数据C、F有关系;对于数据F来说,和数据H、G有关系。这就是“一对多”的关系。 

将具有“一对多”关系的集合中的数据元素按照树的形式进行存储,整个存储形状在逻辑结构上看,类似于实际生活中倒着的树,所以称这种数据的存储结构称为“树”。

一、树的基本概念

树是一种非线性的数据结构,包含n个结点的有限集合,结点之间具备一对多的逻辑关系,当树的结点n=0时,该树被称为空树。

(1)树的结点

树结构中,存储的每一个数据元素都被称为树的“结点”。

结点又被细分为:根节点、子节点、叶子结点

 如图所示:叶子结点即树的末端结点,属于没有子结点的结点,统一称为叶子结点。

子树:由某个子结点作为根结点组成的树被称为子树。上图中红色部分就是一个子树。

(2)度

对于一个结点,拥有的子树个数(结点有多少分支)称为结点的度

树的度:一颗树的度是树内各结点的度的最大值。

(3)结点层次

从一棵树的根结点开始,根结点所在层为第一层,根结点的子结点所在层为第二层,依次类推

(4)树的高度 

一棵树的高度是树中结点所在的最大层次。树的高度,也被称为树的深度。

树的特点: 

在任意一个非空树中,有以下特点:

1.有且仅有一个根结点

2.一棵树中的任意两个结点,有且仅有唯一的一条路径连通,不存在回路。

3.一棵树如果有n个结点,那么它一定有n-1条边

二、二叉树

二叉树是一种结点的度不大于2的有序树,子结点通常被称为“左孩子结点”和“右孩子结点”。

 如图所示就是一个二叉树

 这个图中树的度为3,所以此树就不是一个二叉树

二叉树又被分为满二叉树完全二叉树 

(1)满二叉树

满二叉树是一种特殊的二叉树,它的所有非叶子节点都存在左右子结点,并且所有的叶子结点都在同一层级

image.png

满二叉树的特点:

(2)完全二叉树 

如果二叉树中,从根结点到倒数第二层,符合满二叉树要求,其叶子结点可以不完全填充,但必须靠从左到右连续分布,这样的二叉树被称为完全二叉树。

image.png

三、二叉树的存储 

(1)顺序存储

顺序存储指的是使用顺序表(数组)存储二叉树。但是顺序存储只适用于完全二叉树。满二叉树也是完全二叉树,所以同样适用。

在顺序存储中,顺序表中的每一个位置仅存储结点的data,不需要存储左右子结点的指针,子结点的索引通过计算父结点下标完成。

如果一个父结点的下标为parentIndex它的左结点下标为:2parentIndex,  右子结点下标为:2parentIndex+1

如果完全二叉树,使用数组顺序存储,可以完全利用数组空间

完全二叉树的顺序存储.png

如果是普通二叉树,使用数组顺序存储,在数组中就会出现空隙,导致内存利用率降低

二叉树的顺序存储.png

//基于数组(顺序存储)的二叉树
public class BinaryTree1<E> {
//	创建一个新的空数组用来存储二叉树private Object[] elementData=null;
//	进行初始化操作public BinaryTree1(E[] elements) {
//		新数组的长度要比放入数据的数组长度大一个,因为新数组中从下标为1开始存储elementData=new Object[elements.length+1];for(int i=0,index=1;i<elements.length;i++,index++) {elementData[index]=elements[i];}}
//	获取指定下标处的元素public E get(int index) {return (E) elementData[index];}//	获取指定下标的左孩子public E left(int index) throws Exception {
//		index<<1  即2倍的index,一个子节点的下标的二倍是他的左孩子结点,如果2倍的index大于等于数组长度则没有左子孩子if((index<<1)>=elementData.length) {throw new Exception("没有左孩子");}return (E) elementData[index<<1];}//	获取指定下标的右孩子public E right(int index) throws Exception {if((index<<1)+1>=elementData.length) {throw new Exception("没有右孩子");}return (E) elementData[(index<<1)+1];}}

(2)链式存储 

二叉树的链式存储依靠指针将各个结点串联起来,不需要连续的存储空间。

每个结点包括3个属性:

  • 数据 Data
  • 左孩子结点指针 Left
  • 右孩子结点 Right

链式存储二叉树.png

//二叉树的链式存储
public class BinaryTree<E> {
//	根节点TreeNode<E> root;public BinaryTree(E val) {root=new TreeNode<E>(val);}
//	结点类static class TreeNode<E>{E data;TreeNode<E> left;TreeNode<E> right;public TreeNode() {}public TreeNode(E val) {this.data=val;}}public TreeNode<E> left(TreeNode<E> parent,E val){TreeNode<E> newNode=new TreeNode<E>(val);parent.left=newNode;return newNode;}public TreeNode<E> right(TreeNode<E> parent,E val){TreeNode<E> newNode=new TreeNode<E>(val);parent.right=newNode;return newNode;}}

四、二叉树的遍历

前序遍历根结点->左子树->右子树
中序遍历左子树->根结点->右子树
后序遍历左子树->右子树->根结点

(1)前序遍历

先序遍历.png

	public static void preOrder(TreeNode root) {if(root==null) {return;}System.out.print(root.data);preOrder(root.left);preOrder(root.right);}

(2)中序遍历 

中序遍历.png

public static void inOrder(TreeNode root) {if(root==null) {return;}inOrder(root.left);System.out.print(root.data);inOrder(root.right);}

 (3)后序遍历

后序遍历.png

public static void postOrder(TreeNode root) {if(root==null) {return;}postOrder(root.left);postOrder(root.right);System.out.print(root.data);}

 (4)层序遍历

层序遍历,就是按二叉树从上到下,从左到右,依次打印每层中每个结点存储的数据

image.png

public static void levelOrder(TreeNode root) {if(root==null) {return;}Queue<TreeNode> queue=new LinkedList<TreeNode>();queue.offer(root);while(true) {TreeNode t=queue.poll();if(t==null) {break;}
//访问当前节点,就用打印表示访问即可System.out.print(t.data);if(t.left!=null) {queue.offer(t.left);}if(t.right!=null) {queue.offer(t.right);}}}

五、二叉查找树

二叉查找树也称为二叉排序树,即BST,是一种特殊的二叉树,它具备以下特点:

1、若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值

2、若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值。

3、左、右子树也分为二叉排序树

image.png

二叉查找树的优势在于可以快速查找。 

(1)二叉查找树的基本结构

public class BST {
//	根结点TreeNode root;//	树内部类static class TreeNode{Integer data;//结点数据TreeNode left;//左子结点TreeNode rigth;//右子结点TreeNode parent;//父结点public TreeNode() {}public TreeNode(Integer val) {this.data=val;}}}

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

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

相关文章

JVM(八股文)

目录 一、JVM简介 二、JVM中的内存区域划分 三、JVM加载 1.类加载 1.1 加载 1.2 验证 1.3 准备 1.4 解析 1.5 初始 1.6 总结 2.双亲委派模型 四、JVM 垃圾回收&#xff08;GC&#xff09; 1.确认垃圾 1.1 引用计数 1.2 可达性分析&#xff08;Java 采用的方案&a…

Hudi 系列-基础概念-索引机制

目录 前言问题作用减少开销怎么理解数据变更基础 类型全局索引FlinkSpark 总结 前言 Hudi 系列文章在这个这里查看 https://github.com/leosanqing/big-data-study 索引(Index)是 Hudi 最重要的特性之一,也是区别于之前传统数仓 Hive 的重要特点, 是实现 Time Travel, Update…

抢先知:公抓抓 信息挖掘工具

随着经济全球化进程的加速&#xff0c;企业在不断发展和壮大&#xff0c;同时也在不断地适应市场的变化。在这个过程中&#xff0c;企业信息的及时获取和掌握变得至关重要。那么&#xff0c;最新企业信息哪里找呢&#xff1f;在这里介绍几个路径&#xff0c;可以参考&#xff0…

ARM:使用汇编完成三个灯流水亮灭

1.汇编源代码 .text .global _start _start: 设置GPIOF寄存器的时钟使能LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0x1<<5)STR R1,[R0]设置GPIOE寄存器的时钟使能LDR R0,0X50000A28LDR R1,[R0] 从r0为起始地址的4字节数据取出放在R1ORR R1,R1,#(0x1<<4) 第4位设…

Visual Studio自定义模板参数、备注

模板路径&#xff1a; VS2022 x64&#xff1a;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\ItemTemplatesVS2022 x86&#xff1a;C:\Program Files (x86)\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\ItemTemplates 一、声明和启用模板…

4.方法操作实例变量 对象的行为

4.1 操作对象状态的方法 同一类型的每个对象能够有不同的方法行为&#xff0c;任一类的每个实例都带有相同的方法&#xff0c;但是方法可以根据实例变量的值来表现不同的行为。 play()会播放title值表示的歌曲&#xff0c;调用某个实例的play()可能会播放“Politik”而另一个会…

Zabbix自定义脚本监控MySQL数据库

一、MySQL数据库配置 1.1 创建Mysql数据库用户 [rootmysql ~]# mysql -uroot -p create user zabbix127.0.0.1 identified by 123456; flush privileges; 1.2 添加用户密码到mysql client的配置文件中 [rootmysql ~]# vim /etc/my.cnf.d/client.cnf [client] host127.0.0.1 u…

JMeter压测如何分配业务比例?

在进行综合场景压测时&#xff0c;由于不同的请求&#xff0c;要求所占比例不同&#xff0c;那如何实现呢&#xff1f; 有人说将这些请求分别放到单独的线程组下&#xff0c;然后将线程组的线程数按照比例进行配置&#xff0c;这种方法不是很好&#xff0c;想想&#xff0c;不…

百元开放式耳机哪款好一点耐用、百元耳放推荐

在耳机品类中&#xff0c;佩戴无需入耳、可保持耳道舒适的开放式耳机正成为新的潮流&#xff0c;不仅不少消费者趋之若鹜&#xff0c;相对于传统入耳式耳机&#xff0c;开放式耳机具备开放双耳的特性&#xff0c;能敞开耳道&#xff0c;让耳朵随时呼吸&#xff0c;保持干燥透气…

pytorch算力与有效性分析

pytorch Windows中安装深度学习环境参考文档机器环境说明3080机器 Windows11qt_env 满足遥感CS软件分割、目标检测、变化检测的需要gtrs 主要是为了满足遥感监测管理平台&#xff08;BS&#xff09;系统使用的&#xff0c;无深度学习环境内容swin_env 与 qt_env 基本一致od 用于…

MySQL查询(基础到高级)

一、单表查询&#xff1a; 1.基本查询&#xff1a; 1.1 查询多个字段&#xff1a; 1.查询所有字段&#xff1a; select * from 表名;2.查询指定字段&#xff1a; select 字段1,字段2 from 表名; 1.2 去除重复记录 select distinct "字段" FROM "表名"; …

Cuckoo沙箱各Ubuntu版本安装及使用

1.沙箱简介 1.1 沙箱 沙箱是一个虚拟系统程序&#xff0c;允许你在沙箱环境中运行浏览器或其他程序&#xff0c;因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境&#xff0c;在其内部运行的程序并不能对硬盘产生永久性的影响。 在网络安全中&#xff…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(七)放大镜实战

个人实战文档 本次实战是对自己整个api阶段的总结。 参考效果如下地址&#xff1a; http://erabbit.itheima.net/#/product/3995139 本次实战主要分为以下几个模块。 顶部导航模块 需求&#xff1a; 顶部导航开始不显示等页面滑到主导航栏&#xff0c;这个新顶部导航栏滑…

【C++设计模式之策略模式】分析及示例

描述 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在运行时根据不同的情况选择算法的行为。该模式将算法的定义封装成一组易于切换和替换的类&#xff0c;使得算法可以独立于其使用者进行变化。 原理 策略模式通过将具体的算法…

WIN10 NPM的安装

引言&#xff1a; 什么是node.js? javaScript是一门脚本语言&#xff0c;通常被用来编写、执行本地源代码。脚本语言需要一个解析器才能运行&#xff0c;HTML文件中的JavaScript代码由浏览器解析执行。而自行执行JavaScript代码则需要Node.js解析器才能运行。 每个解析器都…

【Jmeter】性能测试脚本开发——性能测试环境准备、Jmeter脚本编写和执行

文章目录 一、常用的Jmeter元件二、性能测试环境准备三、编写Jmeter脚本四、执行测试脚本 一、常用的Jmeter元件 取样器-HTTP请求 作用&#xff1a;发送HTTP请求配置原件-HTTP请求默认值 作用&#xff1a;设置HTTP请求的默认参数配置原件-用户定义的变量 作用&#xff1a;定义…

84.柱状图中最大的矩形

class Solution { public:int largestRectangleArea(vector<int>& heights) {//法一&#xff1a;枚举宽&#xff0c;超时if(0){int nheights.size();int area0;for(int left0;left<n;left){int minHINT_MAX;for(int rightleft;right<n;right){minHmin(minH,hei…

ARM day5

三盏灯流水 .text .global _start _start: 1.LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0X1<<4)STR R1,[R0] 1.LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0X1<<5)STR R1,[R0] 2.LDR R0,0X50006000LDR R1,[R0]BIC R1,R1,#(0X3<<20)ORR R1,R1,#(0X1<<…

文件扫描模块

文章目录 前言文件扫描模块设计初级扫描方案一实现单线程扫描整合扫描步骤 设计初级扫描方案二周期性扫描 总结 前言 我们这个模块考虑的是数据库里面的内容从哪里获取。 获取完成后&#xff0c;这时候,我们就需要把目录里面文件/子文件都获取出来,并存入数据库。 文件扫描模…

强化学习------DQN算法

简介 DQN&#xff0c;即深度Q网络&#xff08;Deep Q-network&#xff09;&#xff0c;是指基于深度学习的Q-Learing算法。Q-Learing算法维护一个Q-table&#xff0c;使用表格存储每个状态s下采取动作a获得的奖励&#xff0c;即状态-价值函数Q(s,a)&#xff0c;这种算法存在很…