树与二叉树(二)

news2025/1/12 12:22:20
		                   **🛀 ♡ ♢ ♤ ♧ ♣ ♦ ♥ ♠🛀**
💥**欢迎来到半之半的博客**,**这篇文章主要讲述数据结构中非常重要的一块内容,
即树与二叉树,相信大家学完必会加深自己的理解。💥**


						**🕝我是半只半,一个大二的在校学生🕥**
				 **🕟喜欢的朋友可以关注一下,下次更新不迷路hh🕤**

💌前言

🧡学习目标

  • 掌握二叉树的定义、性质、存储结构
  • 掌握二叉树的先序、中序和后序遍历方法
  • 掌握二叉树线索化方法
  • 掌握哈夫曼树的建立和哈夫曼编码方法
  • 掌握树和森林和二叉树的相互转换

🧡学习重点

  • 二叉树的性质、遍历
  • 哈夫曼树及哈夫曼编码

🧡学习难点

  • 二叉树的线索化、
  • 哈夫曼树及哈夫曼编码

🤦‍♂️二叉树的存储结构

🧟‍♀️二叉树的顺序结构

实现一般是按满(完全)二叉树的结点编号,依次存放二叉树中的数据元素。
在这里插入图片描述
在这里插入图片描述
如果不是完全二叉树呢?
先转化为完全二叉树。
在这里插入图片描述
在这里插入图片描述
缺点:浪费空间

二叉树的链式结构

在这里插入图片描述
在这里插入图片描述
二叉链表结点类定义:

class BiNode<T>{
T   data;
BiNode<T>   lchild,rchild; //左右孩子指针
  public BiNode(T data,BiNode left,BiNode right){
	this.data = data; 	this.lchild = left;
	this.rchild = right;  }
  public BiNode(T data){ this(data ,null,null);}
  public String toString(){return this.data.toString();} 
  public boolean isLeaf(){ 
	return lchild==null && rchild==null; }

二叉树类定义:

public class BiTree<T>{
  BiNode<T> root;
  public BiTree(){
	this.root = null; //初始化空二叉树	
  }
  public boolean isEmpty(){
	return this.root==null;
  }
	…… //其他操作
}

在n个结点的二叉链表中,有 n+1 个空指针域。
分析:
n个结点必有2n个链域。
除根结点外,每个结点有且仅有一个双亲,所以只会有n-1个结点的链域存放指针,指向非空子女结点。

🐱‍🚀二叉树的遍历

遍历定义——指按某条搜索路线遍访每个结点且不重复(又称周游)。

遍历用途——它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。

遍历实质——将非线性结构线性化。

先序遍历

若二叉树为空,则空操作;
否则:(1)访问根结点 (D)(2)先序遍历左子树 (L)(3)先序遍历右子树 ®

public void DLR(BiNode<T> p){
  if(p!=null){    
	  System.out.print(p.data); 
	  DLR(p.lchild); 
	  DLR(p.rchild); 
	}
}

如下图ABCD的树
在这里插入图片描述

中序遍历

若二叉树为空,则空操作;
否则:(1)中序遍历左子树 (L)(2)访问根结点 (D)(3)中序遍历右子树 ®

public void LDR(BiNode<T> p){
  if(p !=null){    
	  LDR(p.lchild); 
	  System.out.print(p.data); 
	  LDR(p.rchild); 
	}
}

后序遍历

若二叉树为空,则空操作;
否则:(1)后序遍历左子树 (L)(2)后序遍历右子树 ®(3)访问根结点 (D)

public void LRD (BiNode<T> p){
  if(p !=null){    
  LRD (p.lchild); 
  LRD (p.rchild);
	  System.out.print(p.data); 
	}
}

在这里插入图片描述

性质1

若二叉树中各结点的值均不相同,则:
由二叉树的前序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树。(方法:先序、后序确定根,中序分左右)
但由前序序列和后序序列却不一定能唯一地确定一棵二叉树。
如已知一棵二叉树的中序序列和后序序列分别是BDCEAFHG 和 DECBHGFA,我们就可以画出这棵树,
分析:
①由后序遍历特征,根结点必在后序序列尾部(A);
②由中序遍历特征,根结点必在其中间,而且其左部必全部是左子树子孙(BDCE),其右部必全部是右子树子孙(FHG);
③继而,根据后序中的DECB子树可确定B为A的左孩子,根据HGF子串可确定F为A的右孩子;以此类推。

建立二叉树

根据先序遍历生成树的算法:

private int i = 0;
public BiNode<T> create(T[] prelist) //根据先序序列建二叉树
{	BiNode<T> p=null; 
	if(i<prelist.length) {
	T elem = prelist[i] ;	i++;
	if( elem != null ) {
    	p = new BiTNode( elem);  //生成根结点
		p.lchild = create (prelist);  //递归创建左子树
 		p.rchild = create (prelist); //递归创建右子树
 	}	
	return p;								
}			

同时我们还要生成数组,

public BiTree(T[] prelist)
{
	this.root = create(prelist);
}

二叉树遍历的应用

计算二叉树的结点总数

如果是空树结点为0,否则,结点个数为左子树的结点个数+右子树的结点个数+1。

public int NodeCount(BiNode<T> p){
  if(p== null ) return 0;  		    
	else return NodeCount(p.lchild) +
			NodeCount(p.rchild)+1;
} 

计算二叉树的叶子总数

如果是空树,则叶子结点个数为0;
如果只有根结点,则叶子结点个数为1;
否则,为左子树的叶子结点个数+右子树的叶子结点个数。

public int LeafCount(BiNode<T> p){
 	if(p== null) return 0;	//如果是空树返回0
	if (p.lchild==null && p.rchild==null)
		return 1; //如果是叶子结点返回1
	else return LeafCount(p.lchild) + LeafCount(p.rchild);
}

线索二叉树

  • 二叉树存储了其左右孩子信息,而该结点在遍历序列中的直接前驱和直接后继只能在遍历过程中获得。
  • 得到二叉树一个结点在某个遍历序列里的直接前驱和直接后继信息: 再进行一次遍历(费时)
  • 结点中增加两条链,分别指向某遍历序列中的前驱、后继。(费空间)
    若结点有左子树,则lchild指向其左孩子;否则, lchild指向遍历序列中其直接前驱(即线索);若结点有右子树,则rchild指向其右孩子;否则, rchild指向遍历序列中其直接后继(即线索) 。

在这里插入图片描述
我们可以举个例子

先序线索二叉树

在这里插入图片描述

中序线索二叉树

在这里插入图片描述

后序线索二叉树

在这里插入图片描述

🐱‍🚀后记

  • 🕟本章才刚刚开始哦
  • 🕟谢谢您的访问
  • 🕟觉得博主写的好来个三连

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

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

相关文章

Android BLE HIDS Data ,从问询DB 到写入Android 节点的flow 之三

问题点5&#xff1a;Android BLE具体连接flow 并问询DB的API flow 之第二阶段问询&#xff1b; 表示第二阶段的log “Start service discovery: srvc_idx ”在Android9没有&#xff0c;但在Android 8.0中有&#xff0c;所以后续截图基于Android8.0。 -->执行API bta_gattc_…

ORB-SLAM2 ---- Initializer::ReconstructH函数

目录 1.函数作用 2.函数解析 2.1 调用函数解析 2.2 Initializer::ReconstructH函数总体思路 2.2.1 代码 2.2.2 总体思路解析 3.Initializer::CheckRT 3.1 函数作用 3.2 构造函数 3.3 代码 3.4 流程解析 3.4.0 初始化参数 3.4.1 计算初始化两帧的投影矩阵 3.…

[计算机毕业设计]基于SM9的密钥交换方案的实现与应用

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

VMware虚拟机安装黑苹果步骤与常见问题,VMware16,MacOS12.01(Moterey)

资源准备&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1JFtpMVrULiky9l3SvCXX-w 提取码&#xff1a;c452 说明&#xff1a; 1.镜像版本10.14和12.01根据需要选择其一即可&#xff0c;10.14的后缀为cdr&#xff0c;12.01的后缀为ISO&#xff0c;这两种文件VMware都支…

排名前十的运动蓝牙耳机品牌,2022年值得推荐的运动耳机

现在越来越多人使用耳机了&#xff0c;无论是在公交上还是地铁上又或者在运动时&#xff0c;都能看见很多人使用耳机。大多数人群都喜欢在运动健身的时候佩戴着耳机听音乐&#xff0c;音乐能让我们释放压力&#xff0c;并且心情也能够得到愉悦&#xff0c;相比传统有线运动耳机…

抖店token的生成和刷新的实际开发笔记

目录 前言 一、获取token准备事宜 第1点&#xff0c;app_key的获取 第2点&#xff0c;获取method 第3点&#xff0c;获取grant_type 二、token的生成使用步骤 1.token的生成的代码逻辑 三、刷新token的准备事宜 1.refresh_token的获取 2.grant_type的获取 四、token的刷…

AIOT在数字化转型中的机遇和挑战

目录 引言 为什么 IOT 要结合 AI 数字化转型机遇 什么是企业数字化转型 AIOT 在数字化转型中的作用 面临的挑战 架构挑战 安全风险 安全挑战分析 常见安全问题 如何应对 产业赋能 问题分析 如何应对 算力建设 总结 引言 传统的安防市场已经逐渐接近业务成长天花…

一棵完全二叉树的第7层(根节点为第0层)有12个叶子节点,求整棵树最多有多少个节点和最少有多少个节点

答案 一棵完全二叉树的第7层&#xff08;根节点为第0层)有12个叶子节点&#xff0c;求整棵树最多有487487487个节点和最少有139139139个节点。 完全二叉树 定义&#xff1a;一棵深度为kkk的有nnn个节点的二叉树&#xff0c;对树中的节点按从上至下、从左到右的顺序进行编号&am…

Python 对象保存优化机制

Python 为了减少开销与内存的使用而设置一些规则: * 1. 但凡是不可变对象, 在同一个代码块中的对象, 只要是值相同的对象, 就不会重复创建, 而是直接引用已经存在的对象.交互环境下: 不写在一行, 字符类型数据指向一个内存地址, 整型超出小整数则执指向不同的地址. 代码块缩进相…

Hexo搭建Github博客教程

CONTENTS1. 环境配置2. 本地博客搭建3. 部署至Github4. 博客主题设置1. 环境配置 &#xff08;1&#xff09;安装Git Bash&#xff1a;Windows安装配置Git教程&#xff08;2022.11.18 Git2.38.1&#xff09;。 &#xff08;2&#xff09;安装NodeJS&#xff1a;NodeJS的安装及…

基于51单片机的花样流水灯设计

资料编号&#xff1a;113 下面是相关功能视频演示&#xff1a; 113-基于51单片机的花样流水灯设计&#xff08;源码仿真设计报告&#xff09;功能讲解&#xff1a; 采用51单片机的IO控制多个LED灯&#xff0c;实现多种模式的流水灯&#xff0c;全套资料齐全&#xff1a;流水灯…

Aspose.OCR for Java Crack by Xacker

Aspose.OCR for Java 允许您从图像、屏幕截图、图像的特定区域中提取文本&#xff0c;并在任何支持 Java 的平台上从扫描文件创建可搜索的 PDF。凭借其强大且易于使用的 API&#xff0c;即使是复杂的 OCR 任务也只需不到 10 行代码。您无需使用公式和机器学习 - 该库将处理所有…

<C++>深度学习继承

目录 一、继承概念 二、继承的语法 2.1继承关系和访问限定符 2.2派生类继承基类后的成员权限 三、基类和派生类的对象赋值转换 四、继承中的作用域 五、派生类的默认成员函数 六、继承与友元 七、继承与静态成员 八、复杂的菱形继承及菱形虚拟继承 单继承&am…

CS下载、安装以及简单使用

Cobalt Strike4.0中文版下载 渗透利器CobaltStrike 4.0 免费汉化版(含原版补丁) 下载-脚本之家 (jb51.net)下载解压&#xff0c;有中文版本和原版 server&#xff1a;kali&#xff08;自带Java环境&#xff09; clinet&#xff1a;win10 这里直接把原版拖进kali运行不了&#x…

买卖股票的最好时机(一、二)

目录 买卖股票的最好时机(一) 动态规划解决 贪心思想解决 买卖股票的最好时机(二) 贪心思想解决 动态规划解决 买卖股票是经典的动态规划问题&#xff0c;在动态规划的学习与练习中&#xff0c;最令我煎熬的就是状态方程递推&#xff0c;经常出现状态定义好后&#xff0c…

【毕业设计】10-基于单片机的车站安检门/磁性霍尔传感器系统设计(原理图+源码+仿真工程+论文)

【毕业设计】10-基于单片机的车站安检门/磁性霍尔传感器系统设计&#xff08;原理图源码仿真工程论文&#xff09; 文章目录【毕业设计】10-基于单片机的车站安检门/磁性霍尔传感器系统设计&#xff08;原理图源码仿真工程论文&#xff09;资料下载链接任务书设计说明书摘要设计…

css的三种引入方式

目录 三种引入方式 1.行内样式 2.内部样式(内嵌式) 3.外部样式 3.1外链式 3.2导入式 引入方式的优先级 三种引入方式 1.行内样式 行内样式就是直接把css样式添加在HTML标签中,作为style样式的属性值 <!-- 行内/内嵌/嵌入式/内联样式 --><!-- 背景颜色 backgr…

动力节点索引优化解决方案学习笔记——查询优化

3.查询优化 创建一张测试表并插入数据&#xff1a; drop table if exists students; CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT COMMENT "主键id",sname VARCHAR (24) COMMENT 学生姓名,age INT COMMENT 年龄,score INT COMMENT 分数,time TIMEST…

微服务与中间件系列——GateWay整合Swagger3增强Knife4j

微服务与中间件系列——GateWay整合Swagger3增强Knife4jGateWay整合Swagger3增强Knife4j&#xff08;easy模式&#xff09;目的服务端1.导入依赖2.编写配置类3.yaml配置GateWay网关1.文档枚举2.SwaggerProvider3.yaml配置结果增强版服务端1.增加配置参数类2.修改配置类3.修改ya…

Spring框架一文带你吃透IOC技术

本文目录 文章目录本文目录✨loC的技术实现✨实现步骤✨创建接口和实现类✨创建Spring的配置文件和声明bean✨创建spring容器对象✨spring容器创建对象的特点✨创建非自定义类的对象✨创建没有接口的类的对象✨获取容器中对象的信息loC&#xff0c;Inversion ofControl:控制反转…