下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构【教案】第五章树和二叉树目录(2)二叉树 (3)二叉树的定义 (3)二叉树的性质 (5)(6)(7)中|(8)先|后|(9)(10)(10)(11)(12)删除并释放二叉树中以元素值为x 的结点作为根的各子树(12)(13)(14)(15)(16)(18)(18)哈夫曼编码 (18) 51、树的递归定义有且仅有一个根结点、m 个互不相交的有限结点集m 棵子树结点数 n02、基本术语结点:叶子(终端结点)、根、内部结点; 终端结点、非终端结点(分支结点)树的规模:结点的度、树的度、结点的层次、树的高度(深度)结点间的关系:双亲(1)孩子(m),祖先子孙,兄弟,堂兄弟兄弟间是否存在次序:无
2、序树、有序树去掉根结点树森林引入一个根结点3树特有的操作:查找:双亲、最左的孩子、右兄弟插入、删除:孩子ADT Tree数据对象:D=a i|a iElemSet, i=1,2,n, n0 数据关系:若D 为空集,则称为空树;若 D 仅含一个数据元素,则R 为空集,否则 R=H,H 是如下二元关系:在 Droot,它在关系 H 下无前驱;若 D-root,则存在 D-root的一个划分 D1,D2, , D m(m0)(D i 表示构成第i 棵子树的结点集),对任意 jk(1j,km)有 D jD k=,且对任意的 i(1im),唯一存在数据元素 x iD i, 有H(H 表示结点之间的父子关
3、系);H-, 有唯一的一个划分 H1,H2, , H m(m0)(H i 表示第 i 棵子树中的父子关系),对任jk(1j,km)H jH k=,且对任意 i(1im),H i 是D i 上的 i, H i)是一棵符合本定义的树,称为根 root 的子树。基本操作: InitTree(&T)操作结果:构造空树T DestroyTree(&T)初始条件:树T 已存在操作结果:销毁树T ClearTree(&T)初始条件:树T 已存在操作结果:将树T 清为空树初始条件:树T操作结果:若T 为空树,则返回 TRUE,否则返回 FALSE TreeDepth(T)初始条件:树T 已存在操作结果:返回树
4、T 的深度Root(T)初始条件:树T 已存在操作结果:返回T 的根Value(T, cur_e)初始条件:树T 已存在, 是T 中某个结点cur_eAssign(T, &cur_e, value)初始条件:树T 已存在, 是T 中某个结点cur_evalueParent(T, cur_e)初始条件:树T 已存在,cur_e 是T 中某个结点操作结果:若 cur_e 是 T数值为“ 空 ” LeftChild(T, cur_e)初始条件:树T 已存在,cur_e 是T 中某个结点操作结果:若 cur_e 是 T否则返回 “ 空 ” RightSibling(T, cur_e)初始条件:树T 已
5、存在,cur_e 是T 中某个结点操作结果:若cur_e 有右兄弟,则返回它的右兄弟,否则返“空”InsertChild(&T, p, i, c)初始条件:树 T 已存在,p 指向 T 中某个结点,1ip 所指结点的度+1,非空树c 与T 不相交操作结果:插入c 为T 中p 所指结点的第iDeleteChild(&T, p, i)初始条件:树 T 已存在,p 指向 T 中某个结点,1ip 所指结点的度操作结果:删除T 中p 所指结点的第i 棵子树。TraverseTree(T, visit()初始条件:树T 已存在,visit 是对结点操作的应用函数操作结果:按某种次序对T 的每个结点调用函数
6、 visit()一次且至多一次。一旦 visit()失败,则操作失败ADT Tree二叉树一般树的度不定,直接考虑其操作比较困难,故首先考虑度为二的树。这里引入二叉树。二叉树的定义10度2子树有左右之分(子树的个数= 1 或 2 时) 注意:0度2 的有序树二叉树当一个结点只有一个子树时,不存在序的概念二叉树相对树的特殊性:最左的孩子、右兄弟左孩子、右孩子遍历的规律性:L(左子树)、D(根)、R(右子树)的排列上限定为 L 在 R 前访问(有对称关系的,只须考虑其中的一种) ADT BinaryTree数据对象:D=a i|a iElemSet, i=1,2,n, n0 数据关系:若D 为空集
7、,则称为空树;若 D 仅含一个数据元素,则R 为空集,否则 R=H,H 是如下二元关系:在 Droot,它在关系 H 下无前驱;若 D-root,D L, D R (左、右子树的结点集),且D LD R=;若D L,D L 中存在唯一元素x L, 有H(H点之间的父子关系),且存在D L 上的关系H L?H;若 D R, 则D R中存在唯一元素x R, 有H,且存在D R 上的关系H R?H;(3) (D L, H L) 是一棵符合本定义的二叉树,称为根的左子树;(D R, H R)是一棵符合本定义的二叉树,称为根的右子树。基本操作:InitBiTree(&T)操作结果:构造空二叉树T Des
8、troyBiTree(&T)初始条件:二叉树T 已存在操作结果:销毁二叉树T ClearBiTree(&T)初始条件:二叉树T 已存在操作结果:将二叉树T 清为空树BiTreeEmpty(T)初始条件:二叉树T 已存在操作结果:若T 为空二叉树,则返回 TRUE,否则返回 FALSE BiTreeDepth(T)初始条件:二叉树T 已存在操作结果:返回二叉树T 的深度Root(T)初始条件:二叉树T 已存在操作结果:返回T 的根Value(T, cur_e)初始条件:二叉树T 已存在, 是T 中某个结点cur_eAssign(T, &cur_e, value)初始条件:二叉树T 已存在, 是T
9、 中某个结点cur_evalueParent(T, cur_e)初始条件:二叉树T 已存在,cur_e 是T 中某个结点操作结果:若 cur_e 是 T数值为“ 空 ” LeftChild(T, cur_e)操作结果:若 cur_e 是 T 的非叶子结点,则返回它的左孩子,否则返回“ 空 ” RightChild(T, cur_e)初始条件:二叉树T 已存在,cur_e 是T 中某个结点操作结果:若cur_e 有右孩子,则返回它的右孩子,否则返“空”LeftSibling(T, cur_e)初始条件:二叉树T 已存在,cur_e 是T 中某个结点操作结果:返回 cur_e 的左兄弟,若 cur
10、_e 是 T 的左孩子或无左兄弟,则 返 回 “ 空 ” RightSibling(T, cur_e)初始条件:二叉树T 已存在,cur_e 是T 中某个结点操作结果:返回 cur_e 的右兄弟,若 cur_e 是 T 的右孩子或无右兄弟,则 返 回 “ 空 ” InsertChild(&T, p, LR, c)初始条件:二叉树T 已存在,p 指向 T 中某个结点,LR 为 0 或 1, 非空二叉树c 与T 不相交操作结果:插入 c 为 T 中 p 所指结点的左或右子树。p 所指结点的原有左或右子树则成为c 的右子树DeleteChild(&T, p, LR)初始条件:二叉树T 已存在,p 指
11、向T 中某个结点, 为 0 或 1 操作结果:根据 LR 为 0 或 1,删除 T 中 p 所指结点的左或右子树。PreOrderTraverse(T, visit()初始条件:二叉树T 已存在,visit 是对结点操作的应用函数操作结果:先序遍历 T,对每个结点调用函数 visit()一次且仅一次。一旦visit()失败,则操作失败InOrderTraverse(T, visit()初始条件:二叉树T 已存在,visit 是对结点操作的应用函数操作结果:中序遍历 T,对每个结点调用函数 visit()一次且仅一次。一旦visit()失败,则操作失败PostOrderTraverse(T, v
12、isit()初始条件:二叉树T 已存在,visit 是对结点操作的应用函数操作结果:后序遍历 T,对每个结点调用函数 visit()一次且仅一次。一旦visit()失败,则操作失败LevelOrderTraverse(T, visit()初始条件:二叉树T 已存在,visit 是对结点操作的应用函数操作结果:层序遍历 T,对每个结点调用函数 visit()一次且仅一次。一旦visit()失败,则操作失败ADT BinaryTree二叉树的性质1、性质 1:第 i 层至多有 2i-1 个结点(由每个结点最多只有 2 个孩子推出)2、性质 2:深度为k 的二叉树至多有 2k-1 个结点(由性质 1
13、,将各层最多的结点数累加,再结合等比数列的求和得出)考虑:深度为 k 的二叉树至少有多少个结点?(k 个)深度为 k 的 b 叉树至多/至少有多少个结点?( (b k-1)/(b-1),k)3、性质 3:n0=n2+1 (n i 表示二叉树中度为i 的结点个数)012 二叉树中充当其余结点的孩子的结点数n -1(去掉根)= n1+2n 2考虑二叉树的顺序映像问题,寻求一种将二叉树映像为向量的方法:满二叉树:达到性质 1,2 中所述的最大值情况完全二叉树:叶子集中在最下 2 层,最下一层的结点总是尽可能地占满左边的位置 对完全二叉树从上至下,从左至右,从根开始依次编号(1.n)。 4、性质 4:
14、具有 n 个结点的完全二叉树的深度为 5、性质 5:结点间的编号关系考虑:满k 叉树中结点间的编号关系?11) 方法二叉树补足成完全二叉树自上而下、自左至右存储 2) 类型定义#define MAX_TREE_SIZE 100 二叉树的最大结点数 */ typedefElemType SqBiTreeMAX_TREE_SIZE; /* 0 号单元存储根结点 */ 必须引入特殊符号表示所补足的结点上述的类型定义的缺陷:未指明实际二叉树占用的长度,可改进为: typedef structElemType dataMAX_TREE_SIZE+1; /* 1 号单元存储根结点 */ int lengt
15、h; SqBiTree;3) 不足:空间的利用率不高如:若深度为 5 且仅含有 5 个结点的二叉树,必须要占用2425-1 空间。1log 2+n双亲(1(2)若需要找指定结点的双亲,则用三叉链表可在 O(1)时间内获得; 而用二叉链表则需从根开始,采用一定的巡查方法。 2) 二叉链表的类型定义typedef struct BiTNode ElemType data;struct BiTNode *lchild, *rchild; /* 左右孩子指针 */BiTNode, *BiTree; 3) 二叉链表的链域若有n 个结点,则共有2n 个链域;其中n -1不为空,指向孩子。输入序列与二叉树的
16、映射关系完全二叉树的顺序映射:通过补虚结点,将一般的二叉树转变成完全二叉树,再对该完全二叉树的结点按自上而下、自左至右进行输入。二叉树的先序遍历:通过补虚结点,使二叉树中各实际结点均具有左右孩子,在对该二叉树按先序遍历进行输入。树和森林1、树的存储结构 1) 双亲表示法针对每一结点,附设指示其双亲的位置。采用顺序表。MAX_TREE_SIZE 100 /*树的最大结点数*/typedef struct PTNodeElemType data; int parent; PTNode; typedef struct PTNode nodesMAX_TREE_SIZE; int n; /* 结点数
17、*/PTree; 2) 子的位置信息。typedef struct CTNode /* 孩子结点 */int child; /* 孩子结点的位置编号*/ struct CTNode *next; /* 下一个孩子结点 */ *ChildPtr; typedef structChildPtr firstchild; /* 孩子链表的头指针*/ CTBox;typedef structCTBox nodesMAX_TREE_SIZE;int n, r; /* 结点数和根的位置*/ CTree; 3)孩子兄弟法二叉链表表示。针对每一结点,引入其第一个孩子和下一个兄弟的位置域。typedef stru
18、ct CSNode ElemType data;struct CSNode *firstchild, *nextsibling; /* 第一个孩子、下一个兄弟指针*/ CSNode, *CSTree;2、森林与二叉树的转换森林用孩子兄弟法表示,形成二叉链表,可以将它理解为一个二叉树的二叉链表;二叉树用二叉链表表示,可以将该二叉链表理解为孩子兄弟链表, 从而获得森林。|中1、遍历对于二叉树中的结点,有且仅访问一次DR限定L 在R先(根)序遍历 DLR中(根)序遍历 LDR后(根)序遍历 LRD二叉树的递归定义性质,决定了它的很多算法都可用递归实现, 遍历就是其中之一。对于二叉树的遍历,可以不去具
19、体考虑各子问题(左子树、根、右子树)的遍历结果是什么,而去考虑如何由各子问题的求解结果构成原问题(二叉树)的遍历结果递归规律的确定。必须注意的是,当二叉树为空树时应直接给出解答递归结束条件及处理。三种遍历的区别(右图):所经过的路径是相同的;只是在访问结 点的次序不同。每一结点在整个路径中会经过 3 次(第一次到该结点、由左子树回溯到该结点、由右子树回溯到该结点),如在第一次遇到时就访问该结点,那么称之为先序;第二次经过时访问为中序; 第三次经过时访问则为后序。先序遍历Status PreOrderTraverse( BiTree T, Status ( *Visit ) (ElemTypee
20、) e) if ( T != NULL )if ( Visit(T-data) )if ( PreOrderTraverse( T-lchild, Visit ) ) if ( PreOrderTraverse( T-rchild, Visit ) ) return OK;return ERROR;后序遍历Status PostOrderTraverse( BiTree T, Status ( *Visit ) (ElemTypeif ( T != NULL )if ( PreOrderTraverse( T-lchild, Visit ) ) if ( PostOrderTraverse(
21、T-rchild, Visit ) ) if ( Visit(T-data) )return OK; return ERROR;else return OK;e) )中序遍历Status InOrderTraverse( BiTree T, Status ( *Visit ) (ElemTypeif ( T != NULL )if ( InOrderTraverse( T-lchild, Visit ) ) if ( Visit(T-data) )if ( InOrderTraverse( T-rchild, Visit ) ) return OK;return ERROR;else retu
22、rn OK;先|后|中序遍历的应用扩展利用二叉树的遍历算法,适当修改访问结点操作的内容,可以得到求解许多问题的算法。二叉树的创建(基于先序遍历二叉树的线索化的结点,若是则返回位置,否则继续遍历;查找位于某序遍历的第 k 位的结点:遍历前,引入一计数器,用来统计已访问过的结点数,初值为 0;在访问结点时,将该计数器增 1,并看是否达到k,;求叶子结点的数目:遍历前,引入叶子结点计数器,初值为0;访问结点时,将该计数器增 1;遍历结束,则计数器中的值即为所求解;判断二叉树是否仅有度为 2 和 0 的结点:访问结点时,判断该结点的孩子有无情况,求指定结点的层次:孩子结点的层次比其双亲结点层次多一;求
23、二叉树的高度:二叉树的高度 =max(左子树的高度,右子树的高度)+1【思路】【算法】见数据结构(C 语言版)P131 算法 6.4。求二叉树的叶子结点的数目【思路】修改遍历算法的结点访问操作为特殊结点的判定和计数过程,需要注 意的是计数器的处理方式。可以有以下几种计数处理:引入全局的计数器,初始为 0;将遍历操作处理成函数,函数值表示叶子结点的数目;遍历操作增加一个引用参数,用来传出指定二叉树的叶子结点数目。此处,遍历次序的选择对本算法没有太大影响。【算法 1】/ n 为叶子结点的计数器int n=0;void leaf(BiTree T)/ 利用二叉树的先序遍历if(T)/ 访问结点-叶子
24、结点的判定和计数if(!T-lchild & !T-rchild) n+; leaf(T-lchild);leaf(T-rchild);/ 调用结束,即可由n 获得二叉树T 的叶子结点数目,需注意下次调用前须 n=0; 【算法 2】/ 函数值为T 的叶子结点数int leaf(BiTree T)/ 利用二叉树的中序遍历, n 为局部变量if(T)n=leaf(T-lchild);/ 访问结点-叶子结点的判定和计数if(!T-lchild & !T-rchild) n+; n += leaf(T-rchild);return (n);【算法 】/ 引用参数n 为Tvoid leaf(BiTree
25、 T, int &n)/ 利用二叉树的后序遍历n=0;if(T)leaf(T-lchild, n1); leaf(T-rchild, n2);/ 访问结点-叶子结点的判定和计数if(!T-lchild & !T-rchild) n+; n += n1+ n2;求二叉树的高度【思路】二叉树为空时,高度为 0;若 T 不为空,则其高度应为其左右子树高度的最大值再加1。可以有以下几种处理高度值的方法:将遍历处理成函数,函数值表示指定二叉树的高度;遍历操作增加一个引用参数,用来传出指定二叉树的高度。【算法 1】/ 函数值为T 的高度int high(BiTree T)if(!T) return (0)
26、;else return( max( high(T-lchild), high(T-rchild) ) +1 ) ;【算法 2】/ 引用参数h 为T &h)/ 利用二叉树的后序遍历if(!T) h=0;else high(T-lchild, h1); high(T-rchild, h2); h = max(h1, h2)+1; 5.5.4【思路】二叉树为空时,不必释放;若 T 不为空,则先释放其左右子树的所有结点的空间,再释放根结点的空间后序。若在释放子树的空间前,先释放根结点的空间,则需要将子树的根结点的指针暂存到其他变量;否则,无法找到子树。【算法 1】/ 此处 T变化void delet
27、eBiTree(BiTree &T)if(T)deleteBiTree(T-lchild); deleteBiTree(T-rchild);/ 访问结点-释放结点的空间free(T);T=NULL;【算法 2】void deleteBiTree(BiTree &T)if(T)/ 先序遍历,暂存孩子结点指针T1= T-lchild; T2=T-rchild;/ 访问结点-释放结点的空间free(T);deleteBiTree(T1); deleteBiTree(T2);删除并释放二叉树中以元素值为x【思路】整个过程分为两个方面:遍历中查找元素值为 x 的结点查到该结点时,调用 5.5.3 的算法
28、释放子树空间。需要考虑的问题是:如何将全部的结点找到并释放?外层查找采 用的遍历次序对本算法有何影响?从以下 3 个算法中可以看出,利用先序遍历是最合适的;中序和后序,存在一定的多余操作。【算法 1】void deleteXTree(BiTree &T, ElemType x)/ 基于先序的查找if(T)/ 访问结点-判断是否为指定结点-释放树空间if( T-data= x) deleteBiTree(T);else/ 此处 else 不能省略deleteXTree(T-lchild, x); deleteXTree(T-rchild, x);【算法 2】void deleteXTree(Bi
29、Tree &T, ElemType x)/ 基于中序的查找if(T)deleteXTree(T-lchild, x);/ 若 T-data= x,则此步骤多余/ 访问结点-判断是否为指定结点-释放树空间if( T-data= x) deleteBiTree(T);elsedeleteXTree(T-rchild, x);【算法 3】void deleteXTree(BiTree T, ElemType x) / 基于后序的查找if(T)deleteXTree(T-lchild, x);/ 若 T-data= x,则此步骤多余deleteXTree(T-rchild, x);/ 若 T-data
30、= x,则此步骤多余/ 访问结点-判断是否为指定结点-释放树空间if( T-data= x) deleteBiTree(T);1、基本概念二叉树的遍历结果为一个线性序列;有nn+1扩展二叉链,利用空链域存放结点的前驱和后继信息4)rtag : 0结点的右孩子;1结点的直接后继5)名词:线索链表、线索、线索二叉树、线索化6)类型定义typedef enum Link, Thread PointerTag; / Link=0: 指 针 , Thread=1: 线索typedef struct BiThrNode ElemType data;struct BiTNode *lchild, *rchi
31、ld; / 左右孩子指针PointerTag ltag, rtag; / 左右标志BiThrNode, *BiThrTree;为二叉树的线索链表增加一个头结点,令其 lchild 域指向二叉树的根结点,rchild 域指向中(前/后)序遍历时访问的最后一个结点;中序序列中的第一个结点的 lchild 域和最后一个结点的 rchild 域指向头结点。2、在线索树上进行遍历(P133)头结点的初始化:分配结点、域的赋值、递归调用InThreading( ) 线索化、填充 rchild 域需引入指针 pre 保留中序遍历时刚刚访问过的结点,这样便于处理 pre 指向的结点与当前要访问的结点中的链,使
32、这两个结点满足前驱-后继的关系。InThreading( )用来递归地进行二叉链的线索化,故 pre 的初始化不应在 InThreading( )中进行。而可以放在 InOrderThreading( )中进行。树和森林的遍历树:先序、后序,不提中序。用孩子-兄弟法表示后,可以对该二叉链表进行先序遍历和中序遍历,获得相应树的先序和后序遍历结果。树的一些问题可以借鉴二叉树的一些处理方法获取。1、统计叶子结点的个数孩子-兄弟法:每个结点包含一个指向第一个孩子和一个指向下一个右兄弟的指针域叶子结点的特征:结点的 firstchild 为空统计叶子结点的个数在遍历的过程中统计 firstchild 域
33、为空的结点的个数。【算法】/ nint n=0;void CSleaf(CSTree T)/ 利用树的先序遍历if(T)if(!T-firstchild) n+; CSleaf(T-firstchild); CSleaf(T-nextsibling);/ 调用结束,即可由n 获得树T 的叶子结点数目,需注意下次调用前须 n=0;2、求树的高度孩子-兄弟法表示的树:树的高度 =max(相应左子树的高度 +1, 右子树的高度)【算法】/ 引用参数h 为T 的高度void CShigh(CSTree T, int &h)/ 利用二叉链表的后序遍历if(!T) h=0;else CShigh(T-fi
34、rstchild, h1); CShigh(T-nextsibling, h2); h = max(h1+1, h2);3、求树的度【算法】/ degree 表示表示树的度void CSDegree(CSTree T, int ree)/ 利用二叉树的先序遍历/ d 表示T 指向的结点的度if(!T) degree =0;elseif (!T-firstchild) d=0; elsed=1; p= T-firstchild; while(p-nextsibling)p = p-nextsibling; d+;CSDegree (T-firstchild, d1); CSDegree (T-n
35、extsibling, d2); degree = max(d1, d2, d);二叉树的层次遍历【思路】先访问的结点,其孩子结点必然也先访问。引入队列存储已被访问的、但其左右孩子尚未访问的结点指针。若使用链队列,其元素可定义为:typedef struct QNodeBitree data; / 指向二叉树结点的指针struct QNode *next; QNode, *QueuePtr;void LevelTraverse(BiTree T)/ 初始化队列,队列的元素为二叉树的结点指针InitQueue(Q);if ( T )/ 访问根visit( T-data );/ EnQueue(
36、为待入队的元素EnQueue(Q, T);/ 从队列中取已被访问的、但其左右孩子尚未访问的结点指针, 访问其孩子while( !QueueEmpty(Q) )/ 队不为空,则尚有未访问其孩子的结点/ DeQueue()为出队函数,它将原队头元素作为返回值返回p = DeQueue( Q);/ 访问左孩子if( p-lchild ) visit( p-lchild -data ); EnQueue(Q, p-lchild );/ 访问右孩子if( p-rchild ) visit( p-rchild -data ); EnQueue(Q, p-rchild );【算法应用】利用层次遍历,可以求解
37、:找出距指定结点最近或最远的叶子子孙;找出指定层的所有(叶子、2 度、1 度)结点;)判断一棵二叉树是否为完全二叉树【思路】由完全二叉树的定义,对完全二叉树按层次遍历应满足: 1)若某结点没有左孩子,则它一定无右孩子;2)若某结点缺孩子,则其后继必无孩子。利用层次遍历,需要附加一个标志量 bFlag 反映是否已扫描过的结点均有左右孩子。在第一次遇到缺孩子的结点时,可将 bFlag 置为FALSE;此时存在以下两种情况:若它满足1),需要继续扫描后继结点,以判断是否满足 2);若不满足 1),则说明不是完全二叉树。【算法】typedef char BOOL; #define TRUE 1#define
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- AI在桥梁结构健康智能监测中的实践
- 2026年福建高考语文真题及答案
- 初中英语七年级上册Unit 1 Wele to our school!阅读课教学设计
- 初中八年级英语上册Unit 8 How do you make a banana milk shake 听说整合课教学设计
- 初中七年级数学(北师大版2024下册)《探索直线平行的条件》核心知识清单
- 小学四年级综合实践活动《牛奶伴我成长-探秘白色营养的跨学科之旅》项目式学习导学案
- 小学四年级数学《图形的平移:从运动要素到空间观念》教学设计
- 初中数学八年级上册“一元一次不等式”整章复习教案
- 智能办公流程自动化实施手册
- 初中九年级物理复习导学案:质量与体积的测量及密度的深度探究
- 保税集团笔试试题及答案
- 2025年6月浙江省高考生物试卷真题(含答案及解析)
- 三方债权债务抵偿协议书
- 高中政治开学第一课课件(共27张)-2025-2026学年高中政治统编版
- 现代信号处理课件张贤达pdf
- 网络保密管理课件
- 智能工厂建设与生产管理方案
- 人工智能驱动的智慧酒店解决方案
- 贵州七年级数学试卷
- 企业年金政策培训课件
- 卫健委信息安全管理制度
评论
0/150
提交评论