二叉树学习

树是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,一经查实,立即删除!

相关文章

解决MySQL错误:`ERROR 1049 (42000): Unknown database ‘nonexistentdb‘`

在管理MySQL数据库的过程中,我们可能会遇到各种各样的错误信息,这些错误信息有助于我们快速定位并解决问题。本文将深入探讨一个特定的错误——ERROR 1049 (42000): Unknown database nonexistentdb,这个错误会在尝试连接到MySQL服务器上不存…

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

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

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

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

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

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

Anaconda的常用指令

一、conda基础命令 ① 查看conda帮助信息 conda --help # 或者: conda -h ② 查看conda版本 conda --version ③ 更新conda conda update conda ④ 降级conda版本 conda install -n base conda4.6.7 ⑤ 升级conda和anaconda conda update conda conda up…

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 执行下面的命令就可…

算法-快速幂

算法-快速幂 时间复杂度 O(logk) //求 m^k mod p int qmul(int m,int k,int p) {int res1%p;while(k){if(k&1){res*m;res%p;}m*m;m%p;k>>1;}return res; }

出海业务的网络安全挑战

出海业务的扩展带来了巨大的市场机遇,同时也带来了不少网络安全挑战: 数据泄露与隐私保护:跨境数据传输增加了数据被截获和泄露的风险。地理位置限制和审查:某些地区的网络审查和地理位置限制可能阻碍企业正常开展业务。网络攻击…

【svg】—— java解析svg的宽高属性

SVG(Scalable Vector Graphics)是一种基于XML的图像格式,用于描述二维矢量图形。用户在网页上展示高质量的矢量图形,svg图形可以无限放大或缩小而不会失真,保持清晰的边缘和线条。 java对于svg的处理其实比较麻烦&…

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;它用于存储内存地址。指针的实质…

机器学习_PySpark-3.0.3随机森林回归(RandomForestRegressor)实例

机器学习_PySpark-3.0.3随机森林回归(RandomForestRegressor)实例 随机森林回归 (Random Forest Regression): 任务类型: 随机森林回归主要用于回归任务。在回归任务中, 算法试图预测一个连续的数值输出, 而不是一个离散的类别。 输出: 随机森林回归的输出是一个连续的数值,…

算力租赁费用包括哪些

相比于企业自购设备、自建机房、自己运营&#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"/>

Andorid OTA A/B升级

参考 A/B&#xff08;无缝&#xff09;系统更新 升级后的显著变化是 ro.build.date.utc 、和 版本号 发生变化。 ro.odm_dlkm.build.dateThu Mar 28 01:09:45 UTC 2024 ro.odm_dlkm.build.date.utc1711588185ro.odm.build.dateThu Mar 28 01:09:45 UTC 2024 ro.odm.build.dat…

排序算法-桶排序

桶排序是一种基于计数的排序算法&#xff0c;它的核心思想是将待排序的元素分到不同的桶中&#xff0c;然后对每个桶中的元素进行排序&#xff0c;最后将所有桶中的元素依次取出来就得到了有序的结果。 具体的实现步骤如下&#xff1a; 创建一个固定大小的桶数组&#xff0c;…