NO.6数据结构树|二叉树|满二叉树|完全二叉树|顺序存储|链式存储|先序|中序|后序|层序遍历

![[Pasted image 20250716133753.png]]

树与二叉树的基本知识

树的术语

![[Pasted image 20250716133819.png]]

  1. 结点: 树中的每个元素都称为结点, 例如上图中的 A,B,C…
  2. 根结点: 位于树顶部的结点, 它没有父结点,比如 A 结点。
  3. 父结点: 若一个结点有子结点, 那么这个结点就称为其子结点的父结点。
    例如 A 是 B,C,D 的父节点。
  4. 子结点: 一个结点含有的子树的根结点称为该结点的子结点。
    例如 B,C,D 是 A 的子节点。
  5. 兄弟结点: 具有相同父结点的结点互称为兄弟结点。
    例如 B,C,D 结点互为兄弟结点。
  6. 叶子结点: 没有子节点的节点, 例如 B,D,F,G,H 结点。
  7. 结点的层次: 从根开始定义起, 根为第 1 层, 根的子结点为第 2 层, 以此类推。
  8. 树的深度(高度) : 树中结点的最大层次, 右图中的树的深度为 4。
  9. 结点的度: 一个结点含有的子树的个数称为该结点的度。
  10. 树的度: 一棵树中, 最大的结点的度称为树的度,右图中的树的度为 3。
  11. 子孙: 以某结点为根的子树中任一结点都称为该结点的子孙。
  12. 森林: 由 n(n>=0)棵互不相交的树的集合称为森林。

高度为h的m叉树和高度为h,度为m的树有什么区别?

  1. 度为m的树中,必须至少有一个结点有m个孩子结点
  2. m叉树中可以没有一个结点的孩子数等于m,甚至可以是一棵空树。
树的性质:
  1. 树中的结点数等于所有结点的度数加1.
  2. 度为m的树中第i层上至多有m^{i-1}个结点.
  3. 高度为h的m叉树至多有(m^{h} - 1) / (m - 1)个结点
  4. 具有n个结点的m叉树的最小高度为ceil(log_{m}(n(m-1)+1))
二叉树的基本概念

二叉树中每个节点的度数均不超过 2。
![[Pasted image 20250716133940.png]]

二叉树和度为2的有序树有什么区别?

  1. 度为2的树至少有3个结点,二叉树可以为空。
  2. 度为2的有序树的孩子结点的左右次序是相对而言的,
    若某个结点只有一个孩子,则这个孩子就不存在左右这个概念。
    二叉树无论有没有2个孩子,均需要区分左右孩子结点。
满二叉树

![[Pasted image 20250716135636.png]]

性质:

  1. 高为 h 的满二叉树上一共有 2^h -1 个结点。
  2. 高为 h 的满二叉树上, 每层都有 2^{h-1}个结点。
  3. 高为 h 的满二叉树上, 所有的叶子结点都在最后一层。
  4. 高为 h 的满二叉树上, 除叶子结点外, 每个结点的度都为 2.
  5. 高为 h 的满二叉树上, 对每个结点从上到下, 从左到右进行编号(从 1 开始), 对于任意编号 i, 若有双亲, 则其双亲结点的编号一定是 floor(i/2), 若有孩子结点, 则左孩子编号为 2i, 右孩子编号为 2i+1.
完全二叉树

![[Pasted image 20250716135725.png]]

性质:

  1. 高为 h, 有 n 个结点的完全二叉树上, 编号与满二叉树的一一对应。
  2. 高为 h, 有 n 个结点的完全二叉树上, 若结点编号 i>floor(n/2), 则该结点一定是叶子结点, 否则是非叶子结点。
  3. 高为 h, 有 n 个结点的完全二叉树上, 叶子结点只会处于最后一层和倒数第二层。
  4. 高为 h, 有 n 个结点的完全二叉树上, 只可能存在一个结点度为 1 并且它肯定只有左孩子没有右孩子。
  5. 高为 h, 有 n 个结点的完全二叉树上, 若 n 为奇数则所有结点度都为 2, 若为偶数,则有一个结点度为 1。
  6. 具有 n 个(n>0)结点的完全二叉树的高度为 ceil(log_{2} (n+1))或 floor(log_{2} n)+1

6.证明:设完全二叉树的高度为h,则有
2^{h-1}-1 (高度为h-1的满二叉树)<n≤2^{h} -1(高度为h的满二叉树)
或 2^{h-1}≤n < 2^h 得 2^{h-1}<n+1 ≤ 2^h ,
即 h-1<log_{2}(n+1)≤h,
故 h= ceil(log_{2} (n+1))
或得 h-1 ≤log_{2}(n)<h,
故 h=floor(log_{2} n)+1

二叉树的性质
  1. 树中的结点数等于所有结点的度数加1
  2. 二叉树第 k 层上的结点数目最多为 2k-1。 (k≥1)
  3. 深度为 k 的二叉树至多有 2k -1 个结点。 (k≥1)
  4. 包含 n 个结点的二叉树的高度至少为 log2(n+1)。
  5. 在任意一棵二叉树中, 若叶子结点的个数为 n0, 度为 2 的结点数为 n2, 则 n0=n2+1 。
    证明: 结点总数为 n0+n1+n2,有 n0+n1+n2 = n1+2n2+1 化简得 n0=n2+1
二叉树的存储结构
顺序存储结构

![[Pasted image 20250716140135.png]]

事实一:所有完全二叉树前k个结点的形状结构完全相同
![[Pasted image 20250716140149.png]]

事实二:完全二叉树中结点编号与其位置一对应
![[Pasted image 20250716140213.png]]

注: 数组编号应从 1 开始, 不然无法满足前面所述的二叉树节点编号之间的关系, 无法做到随机访问。 此方法也是后面堆排序的基础。

链式存储结构

数据结构定义

typedef struct BiTNode{Elemtypedata;struct BiTNode *Ichild, *rchild;
}BiTNode;typedef struct BiTreeBiTNode *root;
}BiTree;

注: 一棵含有 n 个结点的二叉树采用链式存储结构时, 有 n+1 个指针处于闲置状态, 也就是没有高效利用内存

二叉树的遍历

设解决某个递归问题的时间为T(N)其中处理一半问题的时间为T(N/2)
设其他处理的时间为O(N)
T(N) = 2*T(N/2) +c*N
则有T(N/2)= 2*T(N/4)+c*N/2
代入得T(N) = 2*(2*T(N/4)+c*N/2)+c*N
以此类推,
T(N) = 2^k* T(N/2^k)+ k*c*N
N/2^k=1时,(N=2^k,k=log_{2}N 则有T(N)= 2^{k}*O(1)+k*c*N =N*O(1) + logN*c*N
O(nlogn)

以 A 为根节点的二叉树可以在左子树上递归划分
![[Pasted image 20250716140505.png]]

先序遍历
  1. 访问根节点
  2. 先序遍历左子树
  3. 先序遍历右子树
void PreOrder(BiTree T){//先序递归遍历if(T != Null){ visit(T);PreOrder(T->lchild);PreOrder(T->rchild);}
}
中序遍历
  1. 中序遍历左子树
  2. 访问根节点
  3. 中序遍历右子树
void InOrder(BiTreeT) //中序递归遍历if(T != Null){InOrder(T->lchild); visit(T); InOrder(T->rchild);}
}

中序递归遍历时,当访问到某结点时,其他结点的状态?
当访问到任意结点时,都代表以该结点为根的左子树已经遍历完成并且都退出了栈;
若该结点是其双亲结点的左孩子,则它的双亲结点此时还没有被访问且在栈中;
若该结点是其双亲结点的右孩子,那么此时其双亲结点已经被访问过并且出栈了。

注:对于系统栈来说,中序遍历时,左右子树都访问完才会出栈双亲结点,而非递归遍历时用户自己申请的栈一般是双亲结点出栈后才访问的右子树(具体代码可能有不同的实现)

后序遍历
  1. 后序访问左子树
  2. 后序访问右子树
  3. 访问根节点
void PostOrder(BiTree T) //后序递归遍历if(T != Null){PostOrder(T->lchild);PostOrder(T->rchild); visit(T);}
}

后序递归遍历时,当访问到某结点时,其他结点的状态?
若该结点是其双亲结点的左孩子,此时其双亲结点都没有被访问到并且还在栈中。而且该结点的所有祖先结点也保存在栈中。
若该结点是其双亲结点的右孩子,此时其双亲结点都没有被访问到并且还在栈中。而且该结点的所有祖先结点也保存在栈中。
当访问到任意结点时,都代表以该结点为根的子树已经全部遍历完成并且都退出了栈,不会再访问到。
不管该结点是其双亲结点的左孩子还是右孩子,此时其双亲结点都没有被访问到并且还在栈中。而且该结点的所有祖先结点也保存在栈中。

层序遍历

从上至上、 从左至右依次访问树中的每个节点

void LevelOrder(BiTree T) //层序遍历InitQueue(Q);//声明队列BiTree p; //声明工作结点EnQueue(Q, T);//根结点入队while(!isEmpty(Q)){//遍历整棵树 DeQueue(Q,p);//出队visit(p); //访问当前结点if(p->lchild != Null{ //左孩子入队EnQueue(Q, p->lchild);} if(p->rchild != Null{ //右孩子入队 EnQueue(Q, p->rchild);}}
}

若想要从下到上, 从右到左(也就是层序遍历逆序列)的遍历一棵二叉树, 只需要在层序遍历的基础上再借助一个栈即可实现。

例题

先序序列为 abcd 的不同二叉树的个数为( )B
A.13 B.14
C.15 D.16
![[Pasted image 20250716142759.png]]

![[Pasted image 20250716142841.png]]

f(4) = 2f(3)+2(f(1)× f(2))
![[Pasted image 20250716143050.png]]

f(3) = 2f(2) + f(1)× f(1)
![[Pasted image 20250716143106.png]]

f(2) = f(1) + f(1) = 2
f(3) = 2f(2) + f(1)× f(1) = 5
f(4) = 2f(3)+2(f(1)× f(2)) = 10+4 = 14

思考: 先序序列为1,2,3,…,n的二叉树一共有多少种不同的形状?
f(4) = 2f(3)+2(f(1)× f(2))
= f(3)× f(0) + f(2)× f(1) + f(1)× f(2) + f(0)× f(3), (f(0)=1)

f(n) = f(n-1)× f(0) + f(n-2)× f(1)+… + f(1)× f(n-2) + f(0)× f(n-1), (f(0)=1)

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

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

相关文章

数据集下载网站

名称简介链接Kaggle世界上最大的数据科学竞赛平台之一&#xff0c;有大量结构化、图像、文本等数据集可直接下载✅支持一键下载、APIPapers with Code可按任务&#xff08;如图像分类、文本生成等&#xff09;查找模型与数据集&#xff0c;标注 SOTA✅与论文强关联Hugging Face…

Tomcat 生产 40 条军规:容量规划、调优、故障演练与安全加固

&#xff08;一&#xff09;容量规划 6 条 军规 1&#xff1a;线程池公式 maxThreads ((并发峰值 平均 RT) / 1000) 冗余 20 %&#xff1b; 踩坑&#xff1a;压测 2000 QPS、RT 200 ms&#xff0c;理论 maxThreads500&#xff0c;线上却设 150 导致排队。军规 2&#xff1a;…

深入解析 Amazon Q:AWS 推出的企业级生成式 AI 助手

在人工智能助手竞争激烈的当下&#xff0c;AWS 重磅推出的 Amazon Q 凭借其强大的企业级整合能力&#xff0c;正成为开发者提升生产力的新利器。随着生成式 AI 技术席卷全球&#xff0c;各大云厂商纷纷布局智能助手领域。在 2023 年 re:Invent 大会上&#xff0c;AWS 正式推出了…

物流自动化WMS和WCS技术文档

导语大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。欢迎大家使用我们的仓储物流技术AI智能体。新书《智能物流系统构成与技术实践》新书《智能仓储项目出海-英语手册&#xff0c;必备&#xff01;》完整版文件和更多学习资料&#xff0c;…

Web3.0 实战项目、简历打造、精准投递+面试准备

目录 一、获取真实企业级 Web3.0 项目的 5 种方式 1. 参与开源项目&#xff08;推荐指数&#xff1a;⭐⭐⭐⭐⭐&#xff09; 2. 参与黑客松&#xff08;Hackathon&#xff09; 3. 远程实习 & DAO 协作项目&#xff08;兼职也可&#xff09; 4. Web3 Startup 实战项目合…

pymongo库:简易方式存取数据

文档 基础使用 前提&#xff1a;开发机器已安装mongo配置环境&#xff0c;已启动服务。 macOS启动服务&#xff1a;brew services start mongodb-community8.0 macOS停止服务&#xff1a;brew services stop mongodb-community8.0安装&#xff1a;python3 -m pip install pym…

Java 线程池与多线程并发编程实战全解析:从异步任务调度到设计模式落地,200 + 核心技巧、避坑指南与业务场景结合

多线程编程在现代软件开发中扮演着至关重要的角色&#xff0c;它能够显著提升应用程序的性能和响应能力。通过合理利用异步线程、多线程以及线程池等技术&#xff0c;我们可以更高效地处理复杂任务&#xff0c;优化系统资源的使用。同时&#xff0c;在实际应用中&#xff0c;我…

gitee 分支切换

ssh-keygen -t rsa -C "pengchengzhangcplaser.com.cn" ssh -T gitgitee.comgit remote add origin 仓库地址git config --global user.email "youexample.com"git config --global user.name "Your Name"# 1. 更新远程信息 git fetch origin# …

Vue3生命周期函数

在 Vue 3 中&#xff0c;生命周期钩子函数是指组件从创建到销毁的整个过程中&#xff0c;Vue 自动调用的一些特定函数。它们让你能够在组件的不同阶段执行一些自定义操作。Vue 3 提供了组合式 API 和选项式 API 两种方式来定义生命周期钩子。1. onBeforeMount (组合式 API)作用…

基于SEP3203微处理器的嵌入式最小硬件系统设计

目录 1 引言 2 嵌入式最小硬件系统 3 SEP3202简述 4 最小系统硬件的选择和单元电路的设计 4.1 电源电路 4.2 晶振电路 4.3 复位及唤醒电路 4.5 存储器 4.5.1 FLASH存储 4.5.2 SDRAM 4.6 串行接口电路设计 4.7 JTAG模块 4.8 扩展功能&#xff08;LED&#xff09; …

【开源软件推荐】 SmartSub,一个可以快速识别视频/音频字幕的工具

背景介绍 我就说Github上面能找到好东西吧 事情是这样的 我最近在用PC端的剪映剪辑视频 需要用到它的语音转字幕功能 转完之后&#xff0c;导出的时候 发现 赫然有一项字幕识别的会员权益 我寻思看看什么价格 不贵的话就充了 好家伙&#xff0c;这不看不知道&#xff…

自动驾驶仿真领域常见开源工具

自动驾驶仿真领域常见开源工具1、目录1.1 自动驾驶仿真领域常见开源2、地图&场景2.1、场景播放器-Esmini4、被测对象-智驾软件4.1、Autoware4.4、端到端模型-VAD4.5、端到端模型-UniAD4.6、端到端模型-ThinkTwice4.7、端到端模型-TCP5、评价方法5.1、Leaderboard5.2、Bench…

GPU算力租用平台推荐,价格便宜且有羊毛薅,最低只要0.49/小时!

1.趋动云&#xff0c;这是我近期一直在用的&#xff0c;使用体验还不错&#xff0c;推荐给大家 网址&#xff1a;https://platform.virtaicloud.com/gemini_web/auth/register?inviteCode5f74065eac6d8867eac5c82194e2683a 是否选择一个算力平台我认为有几点需要考虑&#xff…

python学智能算法(二十五)|SVM-拉格朗日乘数法理解

引言 前序学习进程中&#xff0c;已经对最佳超平面的求解有了一定认识。 刚好在此梳理一下: 函数距离 首先有函数距离F&#xff0c;也可以称为函数间隔F&#xff1a; Fmin⁡i1...myi(w⋅xib)F \min_{i1...m}y_{i}(w \cdot x_{i}b)Fi1...mmin​yi​(w⋅xi​b) 几何距离 然后…

vscode 源码编译

windows 环境 下载安装 build tools Visual Studio Build Tools 勾选 C 因为安装详细信息里是 v143&#xff0c;所以单个组件里也要追加两个 143 的勾选 点击安装&#xff0c;安装好重启下电脑 Electron 安装失败&#xff1a;connect ETIMEDOUT 20.205.243.166:443 为防Ele…

读取和写入json,xml文件

一、JSON文件操作​ 1. 核心类​​ ​​QJsonDocument​​&#xff1a;表示整个JSON文档&#xff0c;提供解析&#xff08;fromJson()&#xff09;和序列化&#xff08;toJson()&#xff09;功能。 ​​QJsonObject​​&#xff1a;存储键值对集合&#xff0c;支持嵌套对象和数…

深度学习×第10卷:她用一块小滤镜,在图像中找到你

&#x1f308;【第一节 她看到的是像素点&#xff0c;却试图拼出你整张脸】&#x1f4f8; 图像是什么&#xff1f;她从未见过你&#xff0c;但看见的是你的一片光斑图像&#xff0c;在神经网络的眼里&#xff0c;是一个个数字格子。这些格子&#xff0c;每个都有 0~255 的亮度…

计算机组成原理中的RAM:核心技术深度解析

摘要&#xff1a;本文深度剖析RAM在计算机体系中的核心地位&#xff0c;结合2025年最新技术标准与实测数据&#xff0c;涵盖DRAM工作原理、主流技术对比、非易失性存储革新及未来发展趋势&#xff0c;为硬件开发者和系统架构师提供权威技术参考。一、RAM基础原理与系统交互机制…

C语言—深入理解指针(详)

深入理解指针&#xff08;详解&#xff09;前言一、指针是什么1、指针的定义2、指针的大小二、指针类型1、类型2、不同类型的意义三、野指针1、野指针形成原因2、如何避免野指针四、指针的运算1、 指针整数2、指针-指针3、指针的关系运算五、const修饰指针1、consr修饰变量2、c…

小谈相机的学习过程

前言博主本人并非专职相机开发&#xff0c;还涉及系统的其他几个模块&#xff0c;虽然都属于owner&#xff0c;但是都还在学习探索的一个过程&#xff0c;自认为掌握还不够细致&#xff0c;此篇文章仅梳理&#xff0c;总结&#xff0c;印证自己近五年相机模块的一个学习过程&am…