数据结构二叉树
03、1数据结构第一部分--线性表-树与二叉树

数据结构(一)目录第1章序论 (1)1.1 什么是数据? (1)1.2 什么是数据元素? (1)1.3 什么是数据结构及种类? (1)1.4 数据的逻辑结构 (1)1.5 数据的物理结构 (1)1.6 算法和算法分析 (1)1.7 算法的五个特性 (1)1.8 算法设计的要求 (2)1.9 算法效率的度量 (2)第2章线性表 (3)2.1 线性表举例 (3)2.2 线性表的存储 (4)2.3 线性表-栈 (4)2.4 队列 (4)2.5 双端队列 (6)第3章树和二叉树 (6)3.1 树 (6)3.1.1 树的基本概念 (6)3.1.2 树的常用存储结构 (6)3.1.3 树的遍历 (7)3.2 二叉树 (7)3.2.1 二叉树的基本概念 (7)3.2.2 二叉树与树的区别 (7)3.2.3 树及森林转到二叉树 (7)3.2.4 二叉树的性质 (8)3.2.5 满二叉树 (8)3.2.6 完全二叉树 (8)3.2.7 完全二叉树的性质 (9)3.2.8 二叉树的四种遍历 (9)3.2.9 二叉排序树 (10)3.2.10 平衡二叉树 (11)3.2.11 m阶B-树 (11)3.2.12 最优二叉树 (11)3.2.13 二叉树的存储结构 (12)3.3 广义表 (13)3.4 矩阵的压缩存储 (14)3.4.1 特殊矩阵 (14)3.4.2 压缩存储 (14)第4章历年真题讲解 (15)4.1 2009年上半年 (15)4.2 2009年下半年 (15)4.3 2010年上半年 (15)4.4 2011年上半年 (16)4.5 2011年下半年 (16)4.6 2012年上半年 (17)4.7 2012年下半年 (17)4.8 2013年上半年 (18)4.9 2013年下半年 (18)4.10 2014年上半年 (18)4.11 2014年下半年 (19)4.12 2015年上半年 (19)4.13 2015年下半年 (19)4.14 2016年上半年 (20)第1章序论什么是数据?所有能输入到计算机中并能够被计算机程序处理的符号的总称,它是计算机程序加工的原料。
数据结构 二叉排序树

9.6.2 哈希函数的构造方法
构造哈希函数的目标:
哈希地址尽可能均匀分布在表空间上——均 匀性好; 哈希地址计算尽量简单。
考虑因素:
函数的复杂度; 关键字长度与表长的关系; 关键字分布情况; 元素的查找频率。
一、直接地址法 取关键字或关键字的某个线性函数值为哈希地址 即: H(key) = key 或: H(key) = a* key + b 其中,a, b为常数。 例:1949年后出生的人口调查表,关键字是年份 年份 1949 1950 1951 … 人数 … … … …
9.4 二叉排序树
1.定义:
二叉排序树(二叉搜索树或二叉查找树) 或者是一棵空树;或者是具有如下特性的二叉树
(1) 若它的左子树不空,则左子树上所有结点的 值均小于根结点的值;
(2) 若它的右子树不空,则右子树上所有结点 的值均大于等于根结点的值; (3) 它的左、右子树也都分别是二叉排序树。
例如:
H(key)
通常设定一个一维数组空间存储记录集合,则 H(key)指示数组中的下标。
称这个一维数组为哈希(Hash)表或散列表。 称映射函数 H 为哈希函数。 H(key)为哈希地址
例:假定一个线性表为: A = (18,75,60,43,54,90,46) 假定选取的哈希函数为
hash3(key) = key % 13
H(key) = key + (-1948) 此法仅适合于: 地址集合的大小 = = 关键字集合的大小
二、数字分析法
假设关键字集合中的每个关键字都是由 s 位数 字组成 (u1, u2, …, us),分析关键字集中的全体, 并从中提取分布均匀的若干位或它们的组合作为 地址。 例如:有若干记录,关键字为 8 位十进制数, 假设哈希表的表长为100, 对关键字进行分析, 取随机性较好的两位十进制数作为哈希地址。
数据结构树的种类

数据结构树的种类树是一种基本的数据结构,用于表示具有层次结构的数据。
它由一组节点组成,其中的每个节点都可以有零个或多个子节点。
树可以有不同的种类,每种种类具有不同的特点和应用场景。
以下是一些常见的树的种类:1. 二叉树(Binary Tree):二叉树是一种每个节点最多只有两个子节点的树结构。
它可以是空树,或者由一个根节点、左子树和右子树组成。
二叉树具有简单的结构,常用于二分和排序。
2. 二叉树(Binary Search Tree):二叉树是一种具有以下特点的二叉树:左子树中的所有节点都比根节点小,右子树中的所有节点都比根节点大。
二叉树支持快速的查找、插入和删除操作,并在树中保持有序性。
3. 平衡二叉树(Balanced Binary Tree):平衡二叉树是一种二叉树,但它在插入和删除节点时会自动调整树的结构以保持树的平衡性。
平衡二叉树的常见实现包括 AVL 树和红黑树,它们可以提供在最坏情况下仍保持对数时间复杂度的查找、插入和删除操作。
4. B树(B-Tree):B树是一种自平衡的树结构,它具有以下特点:每个节点可以有多个子节点,每个节点中的键值有序排列,并且每个节点中的键值数量有一个上限和下限。
B树通常用于大规模数据的存储和数据库系统。
5. Trie树(Trie Tree):Trie树,也称为字典树或前缀树,是一种专门用于处理字符串集合的树结构。
Trie树的每个节点都代表一个字符串前缀,通过将字符逐级插入树中,可以高效地完成字符串的和查找操作。
6. 线段树(Segment Tree):线段树是一种用于处理区间查询问题的树结构。
它将要处理的区间划分为一系列离散的线段,并为每个线段创建一个节点。
线段树可以高效地回答关于区间的统计性质,如区间最小值、区间最大值、区间和等。
7. 堆(Heap):堆是一种完全二叉树,它具有以下特点:对于每个节点,它的值都大于等于(或小于等于)它的子节点的值。
堆被广泛应用于优先队列、排序算法(如堆排序)以及图算法中。
数据结构之二叉树(BinaryTree)

数据结构之⼆叉树(BinaryTree)⽬录导读 ⼆叉树是⼀种很常见的数据结构,但要注意的是,⼆叉树并不是树的特殊情况,⼆叉树与树是两种不⼀样的数据结构。
⽬录 ⼀、⼆叉树的定义 ⼆、⼆叉树为何不是特殊的树 三、⼆叉树的五种基本形态 四、⼆叉树相关术语 五、⼆叉树的主要性质(6个) 六、⼆叉树的存储结构(2种) 七、⼆叉树的遍历算法(4种) ⼋、⼆叉树的基本应⽤:⼆叉排序树、平衡⼆叉树、赫夫曼树及赫夫曼编码⼀、⼆叉树的定义 如果你知道树的定义(有限个结点组成的具有层次关系的集合),那么就很好理解⼆叉树了。
定义:⼆叉树是n(n≥0)个结点的有限集,⼆叉树是每个结点最多有两个⼦树的树结构,它由⼀个根结点及左⼦树和右⼦树组成。
(这⾥的左⼦树和右⼦树也是⼆叉树)。
值得注意的是,⼆叉树和“度⾄多为2的有序树”⼏乎⼀样,但,⼆叉树不是树的特殊情形。
具体分析如下⼆、⼆叉树为何不是特殊的树 1、⼆叉树与⽆序树不同 ⼆叉树的⼦树有左右之分,不能颠倒。
⽆序树的⼦树⽆左右之分。
2、⼆叉树与有序树也不同(关键) 当有序树有两个⼦树时,确实可以看做⼀颗⼆叉树,但当只有⼀个⼦树时,就没有了左右之分,如图所⽰:三、⼆叉树的五种基本状态四、⼆叉树相关术语是满⼆叉树;⽽国际定义为,不存在度为1的结点,即结点的度要么为2要么为0,这样的⼆叉树就称为满⼆叉树。
这两种概念完全不同,既然在国内,我们就默认第⼀种定义就好)。
完全⼆叉树:如果将⼀颗深度为K的⼆叉树按从上到下、从左到右的顺序进⾏编号,如果各结点的编号与深度为K的满⼆叉树相同位置的编号完全对应,那么这就是⼀颗完全⼆叉树。
如图所⽰:五、⼆叉树的主要性质 ⼆叉树的性质是基于它的结构⽽得来的,这些性质不必死记,使⽤到再查询或者⾃⼰根据⼆叉树结构进⾏推理即可。
性质1:⾮空⼆叉树的叶⼦结点数等于双分⽀结点数加1。
证明:设⼆叉树的叶⼦结点数为X,单分⽀结点数为Y,双分⽀结点数为Z。
数据结构:第9章 查找2-二叉树和平衡二叉树

return(NULL); else
{if(t->data==x) return(t);
if(x<(t->data) return(search(t->lchild,x));
else return(search(t->lchild,x)); } }
——这种既查找又插入的过程称为动态查找。 二叉排序树既有类似于折半查找的特性,又采用了链表存储, 它是动态查找表的一种适宜表示。
注:若数据元素的输入顺序不同,则得到的二叉排序树形态 也不同!
讨论1:二叉排序树的插入和查找操作 例:输入待查找的关键字序列=(45,24,53,45,12,24,90)
二叉排序树的建立 对于已给定一待排序的数据序列,通常采用逐步插入结点的方 法来构造二叉排序树,即只要反复调用二叉排序树的插入算法 即可,算法描述为: BiTree *Creat (int n) //建立含有n个结点的二叉排序树 { BiTree *BST= NULL;
for ( int i=1; i<=n; i++) { scanf(“%d”,&x); //输入关键字序列
– 法2:令*s代替*p
将S的左子树成为S的双亲Q的右子树,用S取代p 。 若C无右子树,用C取代p。
例:请从下面的二叉排序树中删除结点P。
F P
法1:
F
P
C
PR
C
PR
CL Q
CL QL
Q SL
S PR
QL S
SL
法2:
F
PS
C
PR
CL Q
QL SL S SL
数据结构二叉树知识点总结

数据结构二叉树知识点总结二叉树是一种常见的数据结构,它由节点组成,每个节点最多可以有两个子节点,分别称为左子节点和右子节点。
二叉树有很多重要的特性和操作,下面是一些关于二叉树的知识点总结。
1.二叉树的基本概念-根节点:树的顶部节点,没有父节点。
-子节点:根节点下的节点。
-叶节点:没有子节点的节点。
-父节点:一个节点的直接上级节点。
-高度:树的最大层数,根节点的层数为0。
-深度:树的层数,叶节点的深度为最大深度。
-层次遍历:按层次的顺序依次访问每个节点。
2.二叉树的分类-满二叉树:每个节点要么没有子节点,要么有两个子节点。
-完全二叉树:除了最后一层外,其它层的节点都是满的,并且最后一层的节点都靠左排列。
-二叉树:左子节点的值小于父节点的值,右子节点的值大于父节点的值。
3.二叉树的表示方法- 数组表示法:将树的节点按层次遍历的顺序存储在一个数组中,对于任意节点i,它的父节点在位置floor((i-1)/2),左子节点在位置2*i+1,右子节点在位置2*i+2-链表表示法:使用节点对象保存节点的数据和指向左右子节点的指针。
4.二叉树的遍历-前序遍历:先访问根节点,然后递归地遍历左子树和右子树。
-中序遍历:先递归地遍历左子树,然后访问根节点,最后遍历右子树。
-后序遍历:先递归地遍历左子树和右子树,最后访问根节点。
-层次遍历:按层次的顺序依次访问每个节点。
5.二叉树的应用-表达式树:使用二叉树表示数学表达式,可以方便地计算表达式的值。
-堆:一种特殊的二叉树,用于实现优先队列。
-平衡二叉树:保持左右子树高度差不超过1的二叉树,用于实现高效的查找操作。
-哈夫曼树:用于数据压缩,将出现频率较高的字符编码为较短的二进制串。
6.二叉树的操作-插入节点:将新节点插入到树的适当位置,保持二叉树的性质。
-删除节点:删除指定节点,保持二叉树的性质。
-节点:在树中指定节点。
-最小值和最大值:找到树中的最小值和最大值。
-判断是否相等:判断两个二叉树是否相等。
数据结构二叉树知识点总结
数据结构⼆叉树知识点总结术语1. 节点的度:⼀个节点含有的⼦树的个数称为该节点的度;2. 叶节点或终端节点:度为零的节点;3. ⾮终端节点或分⽀节点:度不为零的节点;4. ⽗亲节点或⽗节点:若⼀个节点含有⼦节点,则这个节点称为其⼦节点的⽗节点;5. 兄弟节点:具有相同⽗节点的节点互称为兄弟节点;6. 节点的层次:从根开始定义起,根为第1层,根的⼦节点为第2层,以此类推;7. 树的⾼度或深度:树中节点的最⼤层次;8. 堂兄弟节点:⽗节点在同⼀层的节点互为堂兄弟;9. 节点的祖先:从根到该节点所经分⽀上的所有节点;10. 孙:以某节点为根的⼦树中任⼀节点都称为该节点的⼦孙。
11. 森林:由m(m>=0)棵互不相交的树的集合称为森林;12. 满⼆叉树:⼀棵深度为k,且有2^k-1 (2的k次⽅减⼀)个节点称之为满⼆叉树13. 完全⼆叉树:完全⼆叉树是由满⼆叉树⽽引出来的。
对于深度为K的,有n个结点的⼆叉树,当且仅当其每⼀个结点都与深度为K的满⼆叉树中编号从1⾄n的结点⼀⼀对应时称之为完全⼆叉树。
叶节点只能出现在最下层和次下层,并且最下⾯⼀层的结点都集中在该层最左边的若⼲位置的⼆叉树⼆叉树的性质1.在⾮空⼆叉树中,第i层的结点总数不超过2^(i-1),i>=1;2.深度为h的⼆叉树最多有2^h-1个结点(h>=1),最少有h个结点;3.对于任意⼀棵⼆叉树,如果其叶结点数为N0,⽽度数为2的结点总数为N2,则N0=N2+1;4.具有n个结点的完全⼆叉树的深度为K =[log2n」+1(取下整数)5.有N个结点的完全⼆叉树各结点如果⽤顺序⽅式存储,则结点之间有如下关系:若I为结点编号则如果I>1,则其⽗结点的编号为I/2;6.完全⼆叉树,如果2*I<=N,则其左⼉⼦(即左⼦树的根结点)的编号为2*I;若2*I>N,则⽆左⼉⼦;如果2*I+1<=N,则其右⼉⼦的结点编号为2*I+1;若2*I+1>N,则⽆右⼉⼦。
数据结构二叉树实验报告总结
数据结构二叉树实验报告总结一、实验目的本次实验的主要目的是通过对二叉树的学习和实践,掌握二叉树的基本概念、性质和遍历方式,加深对数据结构中树形结构的理解。
二、实验内容1. 二叉树的基本概念和性质在本次实验中,我们首先学习了二叉树的基本概念和性质。
其中,二叉树是由节点组成的有限集合,并且每个节点最多有两个子节点。
同时,我们还学习了二叉树的高度、深度、层数等概念。
2. 二叉树的遍历方式在了解了二叉树的基本概念和性质之后,我们开始学习如何遍历一个二叉树。
在本次实验中,我们主要学习了三种遍历方式:前序遍历、中序遍历和后序遍历。
其中,前序遍历指先访问节点自身再访问左右子节点;中序遍历指先访问左子节点再访问自身和右子节点;后序遍历指先访问左右子节点再访问自身。
3. 二叉搜索树除了以上内容之外,在本次实验中我们还学习了一种特殊的二叉树——二叉搜索树。
二叉搜索树是一种特殊的二叉树,它的每个节点都满足左子节点小于该节点,右子节点大于该节点的性质。
由于这个性质,二叉搜索树可以被用来进行快速查找、排序等操作。
三、实验过程1. 实现二叉树的遍历方式为了更好地理解和掌握二叉树的遍历方式,我们首先在编程环境中实现了前序遍历、中序遍历和后序遍历。
在代码编写过程中,我们需要考虑如何递归地访问每个节点,并且需要注意访问顺序。
2. 实现二叉搜索树为了更好地理解和掌握二叉搜索树的特性和操作,我们在编程环境中实现了一个简单的二叉搜索树。
在代码编写过程中,我们需要考虑如何插入新节点、删除指定节点以及查找目标节点等操作。
3. 实验结果分析通过对代码运行结果进行分析,我们可以清晰地看到每个遍历方式所得到的结果以及对应的顺序。
同时,在对二叉搜索树进行操作时,我们也可以看到不同操作所产生的不同结果。
四、实验总结通过本次实验,我们进一步加深了对二叉树的理解和掌握,学习了二叉树的遍历方式以及二叉搜索树的特性和操作。
同时,在编程实践中,我们也进一步熟悉了代码编写和调试的过程。
数据结构树和二叉树知识点总结
数据结构树和二叉树知识点总结
1.树的概念:树是一种非线性的数据结构,由节点和边构成,每个节点只能有一个父节点,但可以有多个子节点。
2. 二叉树的概念:二叉树是一种特殊的树结构,每个节点最多只有两个子节点,一个是左子节点,一个是右子节点。
3. 二叉树的遍历:二叉树的遍历分为前序遍历、中序遍历和后序遍历三种方式。
前序遍历是先访问根节点,再访问左子树,最后访问右子树;中序遍历是先访问左子树,再访问根节点,最后访问右子树;后序遍历是先访问左子树,再访问右子树,最后访问根节点。
4. 二叉搜索树:二叉搜索树是一种特殊的二叉树,它满足左子树中所有节点的值均小于根节点的值,右子树中所有节点的值均大于根节点的值。
因此,二叉搜索树的中序遍历是一个有序序列。
5. 平衡二叉树:平衡二叉树是一种特殊的二叉搜索树,它的左子树和右子树的高度差不超过1。
平衡二叉树的插入和删除操作可以保证树的平衡性,从而提高树的查询效率。
6. 堆:堆是一种特殊的树结构,它分为最大堆和最小堆两种。
最大堆的每个节点的值都大于等于其子节点的值,最小堆的每个节点的值都小于等于其子节点的值。
堆常用于排序和优先队列。
7. Trie树:Trie树是一种特殊的树结构,它用于字符串的匹配和检索。
Trie树的每个节点代表一个字符串的前缀,从根节点到叶子节点的路径组成一个完整的字符串。
以上是数据结构树和二叉树的一些基本知识点总结,对于深入学
习数据结构和算法有很大的帮助。
C语言数据结构系列篇二叉树的概念及满二叉树与完全二叉树
C语⾔数据结构系列篇⼆叉树的概念及满⼆叉树与完全⼆叉树链接:0x00 概念定义:⼆叉树既然叫⼆叉树,顾名思义即度最⼤为2的树称为⼆叉树。
它的度可以为 1 也可以为 0,但是度最⼤为 2 。
⼀颗⼆叉树是节点的⼀个有限集合,该集合:①由⼀个根节点加上两颗被称为左⼦树和右⼦树的⼆叉树组成②或者为空观察上图我们可以得出如下结论:①⼆叉树不存在度⼤于 2 的节点,换⾔之⼆叉树最多也只能有两个孩⼦。
②⼆叉树的⼦树有左右之分,分别为左孩⼦和右孩⼦。
次序不可颠倒,因此⼆叉树是有序树。
注意:对于任意的⼆叉树都是由以下⼏种情况复合⽽成的:0x01 满⼆叉树定义:⼀个⼆叉树,如果每⼀层的节点数都达到了最⼤值(均为2),则这个⼆叉树就可以被称作为 "满⼆叉树" 。
换⾔之,如果⼀个⼆叉树的层数为,且节点总数是,则他就是⼀个满⼆叉树。
计算公式:①已知层数求总数:②已知总数求层数:⼗亿个节点,满⼆叉树是多少层?≈ 10亿多0x02 完全⼆叉树定义:对于深度为的,有个结点的⼆叉树,当且仅当其每⼀个结点都与深度为的满⼆叉树中编号从 1 ⾄的结点⼀⼀对应时称之为完全⼆叉树。
前层是满的,最后⼀层不满,但是最后⼀层从左到右是连续的。
完全⼆叉树是效率很⾼的数据结构,完全⼆叉树是由满⼆叉树⽽引出来的。
所以,满⼆叉树是⼀种特殊的完全⼆叉树(每⼀层节点均为2)。
常识:①完全⼆叉树中,度为 1 的最多只有 1 个。
②⾼度为的完全⼆叉树节点范围是0x03 ⼆叉树的性质①若规定根节点的层数为 1 ,则⼀颗⾮空⼆叉树的第层上最多有个节点。
②若规定根节点的层数为 1 ,则深度为的⼆叉树最⼤节点数是 .③对任何⼀颗⼆叉树,如果度为 0 其叶⼦结点个数为,度为 2 的分⽀节点个数为,则有。
换⾔之,度为 0 的永远⽐度为 2 的多⼀个叶⼦结点。
④若规定根节点的层数为 1 ,具有个节点的满⼆叉树的深度(log是以2为底,n+1的对数)。
对于有个节点的完全⼆叉树,如果按照从上⾄下从左⾄右的数组顺序对所有节点从 0 开始编号,则对于序号为的节点有:(⾮完全⼆叉树,也可以⽤数组存放,但会浪费很多空间)假设是⽗节点在数组中的下标,此公式仅适⽤于完全⼆叉树:①求左孩⼦:②求右孩⼦:③求⽗亲(假设不关注是左孩⼦还是右孩⼦):④判断是否有左孩⼦:⑤判断是否由右孩⼦:PS:⼆叉树不⼀定要标准,⽐如这个其实也是⼆叉树:课后练习:1. 某⼆叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该⼆叉树中的叶⼦结点数为()A. 不存在这样的⼆叉树B. 200C. 1982. 在具有 2n 个结点的完全⼆叉树中,叶⼦结点个数为()A. nB. n+1C. n-1D. n/23. ⼀棵完全⼆叉树的节点数位为531个,那么这棵树的⾼度为()A. 11B. 10C. 8D. 125. ⼀个具有767个节点的完全⼆叉树,其叶⼦节点个数为()A. 383B. 384C. 385D. 386参考资料:Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .笔者:王亦优更新: 2021.11.24勘误:⽆声明:由于作者⽔平有限,本⽂有错误和不准确之处在所难免,本⼈也很想知道这些错误,恳望读者批评指正!本篇完。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构二叉树姓名:周涛学号:201313040322#include <iostream>using namespace std;template <class Type> class BinaryTree;template <class Type> class BTreeNode{ friend class BinaryTree<Type>;private:BTreeNode *lchild,*rchild;Type data;public:BTreeNode():lchild(NULL),rchild(NULL){}BTreeNode(Type item,BTreeNode<Type> *left=NULL,BTreeNode<Type> *right=NULL):data(item),lchild(left),rchild(right){}Type GetNodeData()const { return data;}BTreeNode<Type>* GetLChild()const {return lchild;}BTreeNode<Type>* GetRChild()const {return rchild;}void SetNodeData(Type &item) {data=item;}void SetLChild(BTreeNode<Type> *left) {lchild=left;void SetRChild(BTreeNode<Type> *right) {rchild=right;};template <class Type> class BinaryTree{private:BTreeNode<Type> *root;BTreeNode<Type>* CreateBTree(Type *PreOrder,Type *InOrder,int p1,int p2,int i1,int i2);void PreOrderTraverseBTree(BTreeNode<Type> *BRoot,void(*Visit)(BTreeNode<Type> *x),int num);void InOrderTraverseBTree(BTreeNode<Type> *BRoot,void(*Visit)(BTreeNode<Type> *x),int num);void PostOrderTraverseBTree(BTreeNode<Type> *BRoot,void(*Visit)(BTreeNode<Type> *x),int num);public:BinaryTree(){root=NULL;}void PreOrderTraverseBTree(void(*Visit)(BTreeNode<Type> *x));void InOrderTraverseBTree(void(*Visit)(BTreeNode<Type> *x));void PostOrderTraverseBTree(void(*Visit)(BTreeNode<Type> *x));BTreeNode<Type>* CreateBTree(Type *PreOrder,Type *InOrder,int n);};template<class Type> void BinaryTree<Type>::PreOrderTraverseBTree(void(*Visit)(BTreeNode<Type> *x)){int num=0;PreOrderTraverseBTree(root,Visit,num);return num;}template <class Type> void BinaryTree<Type>::PreOrderTraverseBTree(BTreeNode<Type> * current,void(*Visit)( BTreeNode<Type> * x),int &num ){if(current){Visit(current);num++;PreOrderTraverseBTree(current->lchild,Visit,num);PreOrderTraverseBTree(current->rchild,Visit,num);}}template <class Type> int BinaryTree<Type>::InOrderTraverseBTree( void(*Visit)( BTreeNode<Type> * x)) {int num = 0 ;InOrderTraverseBTree( root, Visit, num );return num;}template <class Type> void BinaryTree<Type>::InOrderTraverseBTree( BTreeNode<Type> * current, void(*Visit)( BTreeNode<Type> * x), int & num ){if(current){InOrderTraverseBTree(current->lchild,Visit,num);Visit(current);num++;InOrderTraverseBTree(current->rchild,Visit,num);}}template<class Type> int BinaryTree<Type>::PostOrderTraverseBTree( void(*Visit)( BTreeNode<Type> * x) ) {int num = 0 ;PostOrderTraverseBTree( root, Visit, num)return num;}template<class Type> voidBinaryTree<Type>::PostOrderTraverseBTree( BTreeNode<Type> * current, void(*Visit)( BTreeNode<Type> * x), int & num ){if(current){PostOrderTraverseBTree( current->lchild, Visit, num )PostOrderTraverseBTree( current->rchild, Visit, num );Visit( current );num++;}}template <class Type> int BinaryTree<Type>::CreateBTree(Type * PreOrder, Type * InOrder,int n){if(root) return 0;root = CreateBTree( PreOrder,InOrder,0 n-1,0,n-1);return 1;}template <class Type> BTreeNode<Type> * BinaryTree<Type>::CreateBTree(Type * PreOrder,Type * InOrder,int p1,int p2,int i1,int i2 ){BTreeNode<Type> * p;if( i1 > i2 ) return NULLp = new BTreeNode<Type>;p->data = PreOrder[p1];int num =0;while( PreOrder[p1] != InOrder[i1+num] ) num++;p->lchild = CreateBTree( PreOrder,InOrder,p1+1,p1+num,i1,i1+num-1 );p->rchild = CreateBTree( PreOrder,InOrder,p1+num+1,p2,i1+num+1,i2 );return p;}template <class Type> void Output(BTreeNode<Type> *x){cout<<x->GetNodeData()<<" ";}int main(){char a[9],b[9];cout<<"输入先序遍历序列:";for(int i=0;i<9;i++){cin>>a[i];}cout<<"输入中序遍历序列:";for(int j=0;i<9;j++){cin>>b[j];}BinaryTree<char> Tree;Tree.CreateBTree(a,b,9);Tree.PostOrderTraverseBTree(Output);return 0;}。