二叉树学习

树是n个结点的有限集合,当n=0时为空树,在任意一颗非空的树中,有且只有一个特定的称为根的结点,当n>1时,其余结点又可以分为m个不相交的有限集,其中每一个集合又是一棵树,并且称为根的子树

树的结点包含一个数据元素以及若干指向其子树的分支,结点拥有的子树称为结点的度,度为0的结点称为叶结点或者终端结点,度不为0的结点称为非终端结点或者分支结点,除根结点之外,分支结点称为内部结点,树的度是树内部各个结点的度的最大值

结点的子树的根称为该结点的孩子,该结点称为孩子的双亲,同一个双亲的孩子之间互相称为兄弟

树的深度:树中结点的最大层次

树的存储结构

  1. 顺序存储结构
  2. 链式存储结构

二叉树

对于在某个阶段都是两种结果的情形,比如开关,01,上下,对错,真假等,都适合使用树状结构来进行建模,这种树被称为二叉树

》》二叉树特点

  1. 每个节点必须有两颗子树
  2. 左子树和右子树是有顺序的,次序不能颠倒
  3. 要能够区分左子树和右子树

二叉树的基本形态

  1. 空二叉树
  2. 只有一个根结点
  3. 根结点只有左子树
  4. 根结点只有右子树
  5. 根结点既有左子树也有右子树

特殊二叉树

1.斜树:所有的结点都只有左子树的二叉树称为左斜树,所有结点都只有右子树的二叉树称为右斜树

2.满二叉树:在一颗二叉树中,所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层次上,这样的二叉树称为满二叉树

3.完全二叉树:对于一颗具有n个结点的二叉树按照层次编号,如果编号为i的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同,那么这颗二叉树称为完全二叉树

此时左边的为完全二叉树,而右边的不是,因为节点的编号不是连续的,C缺少了左子树

完全二叉树特点:

  1. 叶子结点只能出现在最下面两层
  2. 最下面的叶子一定集中在左部的连续位置
  3. 倒数第二层,如果有叶子结点,一定都在右边连续的位置
  4. 如果结点的度为1,那么该结点只有左子树
  5. 同样的二叉树,完全二叉树的深度最小

二叉树的性质

  1. 在二叉树的第i层至多有2^(i-1)个结点
  2. 深度为k的二叉树至多有2^(k-1)个结点
  3. 对于任何一颗二叉树,如果其终端节点数为n,度为2的节点数为m,则n=m+1

》》二叉树的顺序存储结构

虽然顺序结构对于树这种一对多的关系结构实现起来比较困难,但是二叉树具有特殊性,二叉树的结点是按照特定的顺序进行编号的,因此可以使用顺序存储结构也可以实现二叉树,但是考虑的特殊情况(每个结点只有右子树),就会造成内存空间的极大浪费,因此顺序存储结构一般只适用于完全二叉树

二叉树的链式存储结构

二叉树的节点

为二叉树的每个结点都设置两个指针域和一个数据域,分别用来指向其子树和存储数据

其中data就为二叉树节点的数据域,存储节点的数据

ltree和rtree为指针域,分别指向其左子树和右子树

二叉树的遍历方法

1.前序遍历

如果二叉树为空,则返回空,否则返回根结点,否则前序遍历左子树,再前序遍历右子树

只要传入的二叉树不为空,则打印出当前节点的值,再递归调用函数遍历其左子树,最后递归调用函数遍历其又子树

2.中序遍历

如果二叉树为空,则返回空,否则中序遍历左子树,访问根结点,再中序遍历右子树

3.后序遍历

如果二叉树为空,则返回空,否则后序遍历左子树,后序遍历右子树,访问根结点

4.层次遍历

如果二叉树为空,则返回空,否则从根结点开始,从上往下逐层遍历,在同一层中,按照从左到右的顺序进行访问

这是通过队列来实现的

二叉树遍历性质

  1. 已知一个中序遍历和前序遍历可以确定唯一的二叉树
  2. 已知一个中序遍历和后序遍历可以确定唯一的二叉树

注:如果已知前序和后序遍历是不能确定一颗二叉树的

二叉树的建立

使用补空法建立二叉树,如果结点为#,则该节点为空

建立二叉树算法:

  1. 首先捕获一个值,判断是否为#,如果为#,二叉树为空
  2. 否则循环捕获节点信息,为结点分配内存,分配失败则退出
  3. 递归创造左右结点

二叉树的叶子数,深度,以及节点数

叶子数:只要该节点没有左右子树,那么该节点就为二叉树叶子

深度:找出左右子树的最大深度,再加上根节点,就是该叶子数的深度

节点数:求出根节点左子树的节点数和右子树的节点数,再加上根节点就是该二叉树的节点数

线索二叉树

指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树,对二叉树以某种次序遍历使得其变为线索二叉树的过程称为线索化

线索化的实质就是将二叉树的空指针改为指向前驱或者后继的线索,由于前驱和后继的信息只能在遍历的过程中得到,所以线索化的过程就是修改空指针的过程

对于n个结点的二叉树,一共有2n个指针域,而真正使用的指针域只有n-1个,有n+1个指针域没有被利用,因此可以将空指针域的内容填充,让其指向其前驱点或后继

线索二叉树实现

需要两个变量来确定,二叉树的指针域是指向为其子树还是指向其前驱点

设为ltag,rtag,这两个变量为bool类型

当ltag为0时指向该结点的左子树,当ltag为1时指向该结点的前驱

当rtag为0时指向该结点的右子树,当rtag为1时指向该结点的后继

意义

如果所使用的二叉树需要经常进行遍历或者查找某些结点时需要某种遍历序列中的前驱和后继,那么采用线索二叉树

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

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

相关文章

【Java探索之旅】从输入输出到猜数字游戏

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、输入输出1.1 输出到控制台1.2 从键盘输入 二、猜数字游戏2.1 所需知识&#xff1a…

《猎灵online》游戏完整源码(源码+客户端+服务端+文档+工具),云盘下载

《猎灵》是一款由国内知名开发运营开发的大型3D魔幻网游,《猎灵》研发团队突破诸多瓶颈,首创“全自由无限制PK”,让玩家拒绝无意义等待,自由作战不受任何束缚,真正的实现想战就战,游戏创建了六界神魔乱斗的…

Amazon SageMaker:让机器学习变得更简单、更强大

授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 前言: 在大数据时代的浪潮中,数据不再只是…

Python神器!WEB自动化测试集成工具 DrissionPage

案例 跟踪商品价格,降价自动推送消息到微信 咱买不起还等不起吗? from DrissionPage import * import re from time import sleep import csv import os import datetime#写入时间p MixPage() p.get(http://xxxxxxx) #快快买网址 p.to_iframe(iframe…

云服务器centos提示 Cannot prepare internal mirrorlist: No URLs in mirrorlist的解决办法

yum update -y CentOS-8 - AppStream 118 B/s | 38 B 00:00 Error: Failed to download metadata for repo AppStream: Cannot prepare internal mirrorlist: No URLs in mirrorlist 执行下面的命令就可…

CSS特效---纯CSS实现点击切换按钮

1、演示 2、一切尽在代码中 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"w…

HashMap的常见问题

Entry中的hash属性为什么不直接使用key的hashCode()返回值呢&#xff1f; 不管是JDK1.7还是JDK1.8中&#xff0c;都不是直接用key的hashCode值直接与table.length-1计算求下标的&#xff0c;而是先对key的hashCode值进行了一个运算&#xff0c;JDK1.7和JDK1.8关于hash()的实现…

c++ 指针总结

概述 内存地址 在计算机内存中&#xff0c;每个存储单元都有一个唯一的地址(内存编号)。通俗理解&#xff0c;内存就是房间&#xff0c;地址就是门牌号 指针和指针变量 指针&#xff08;Pointer&#xff09;是一种特殊的变量类型&#xff0c;它用于存储内存地址。指针的实质…

算力租赁费用包括哪些

相比于企业自购设备、自建机房、自己运营&#xff0c;服务器租赁是绝大数企业的首先&#xff0c;租赁服务器从一定程度上解决了企业资金预算不足、AI芯片难买的局面。 随着文生视频大模型Sora、大语言模型Grok-1的相继出现&#xff0c;对高新能算力资源和服务的需求不断提高&a…

暴力枚举法

虽然暴力枚举法有时候效率低&#xff0c;时间复杂度高&#xff0c;但是在面对小规模数据集的时候&#xff0c;暴力枚举法往往是很好的思维利器。 B: 01 串的熵&#xff08;5分&#xff09; 问题描述 #include <iostream> #include <cmath> #include <algorithm…

什么是云HIS?云HIS的优点是什么?云HIS适用于什么医院?

什么是云HIS&#xff1f;云HIS的优点是什么&#xff1f;云HIS适用于什么医院&#xff1f; 一、什么是云HIS&#xff1f; 云HIS系统是一个运用云计算、大数据、物联网等新兴信息技术的业务和技术平台。它旨在按照现代医疗卫生管理要求&#xff0c;以数字化形式提供医疗卫生行业…

Mybatis generate xml 没有被覆盖

添加插件即可 <plugin type"org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>

epic免费游戏在哪里领 epic免费游戏怎么领取 图文教程一看就会

Epic Games是一家位于美国北卡罗来纳州卡里的视频游戏和软件开发商&#xff0c;由Tim Sweeney于1991年创立。该公司最著名的作品包括《堡垒之夜》和虚幻引擎&#xff0c;后者是一种广泛用于游戏开发的商用游戏引擎。Epic Games在2020年和2024年分别与索尼和迪士尼达成财务合作及…

ARM架构麒麟操作系统安装配置Mariadb数据库

、安装配置JDK (1)检查机器是否已安装JDK 执行 java -version命令查看机器是否安装JDK,一般麒麟操作系统默认安装openjdk 1.8。 (2)安装指定版本JDK 如果麒麟操作系统默认安装的openjdk 1.8不符合需求的话,可以卸载机器安装的openjdk 1.8并按需安装所需的openjdk版本…

#esp8266模块通过AT指令获取网络时间(苏宁时间)

一、IDE&#xff1a;keil、cubemx、Arduino......... 二、记录&#xff1a; 1.依次发送以下指令&#xff08;发送新行&#xff09; AT ATCWMODE1 ATCWDHCP1,1 ATCWJAP"Redmi K40 Gaming","87654321" ATCIPSTART"TCP","quan.suning.com&quo…

Leetcode110_平衡二叉树

1.leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;…

RabbbitMQ

初识MQ 同步通讯和异步通讯 什么是同步通讯呢&#xff1f;举个例子&#xff0c;你认识了一个小姐姐&#xff0c;聊的很火热&#xff0c;于是你们慢慢开始打电话&#xff0c;视频聊天&#xff0c;这种方式就成为同步通讯&#xff0c;那什么是一部通讯呢&#xff0c;同样的&…

【性能测试】接口测试各知识第3篇:Jmeter 基本使用流程,学习目标【附代码文档】

接口测试完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;接口测试&#xff0c;学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标&#xff0c;RESTFUL1. 理解接口的概念,2.什么是接口测试…

python知识点汇总(十一)

python知识点总结 1、当Python退出时&#xff0c;是否会清除所有分配的内存&#xff1f;2、Python的优势有哪些&#xff1f;3、什么是元组的解封装4、Python中如何动态获取和设置对象的属性&#xff1f;5、创建删除操作系统上的文件6、主动抛出异常7、help() 函数和 dir() 函数…

mybatis05:复杂查询:(多对一,一对多)

mybatis05&#xff1a;复杂查询&#xff1a;&#xff08;多对一&#xff0c;一对多&#xff09; 文章目录 mybatis05&#xff1a;复杂查询&#xff1a;&#xff08;多对一&#xff0c;一对多&#xff09;前言&#xff1a;多对一 &#xff1a; 关联 &#xff1a; 使用associatio…