二叉树的存储与遍历
洛谷题解P4913【【深基16.例3】二叉树深度】

洛⾕题解P4913【【深基16.例3】⼆叉树深度】这是⼀道关于⼆叉树的⼊门题。
这题主要考察⼆叉树的存储以及⼆叉树的遍历。
那么我就来分这两部分来讲。
Part 1 存储考虑⼀个⼆叉树的每个节点都有两个⼦节点,所以我们可以考虑⽤⼀个结构体来存储:其中,和分别代表节点的左节点编号和右节点编号。
当读⼊时,就⾮常⽅便了,直接读⼊即可:Part 2 遍历这道题要我们求⼆叉树的深度,就⼀定要遍历这棵树。
⾸先明确⼀点题⽬中未提到的,编号为1的节点是⼆叉树的根节点。
于是我们可以从根节点出发,先递归遍历该节点的左节点,再递归遍历该节点的右节点。
其中还要记录该节点的深度,出发时深度为1每到⼀个节点时更新⼀下深度:到达叶⼦节点时,就总体上就这么多吧。
因为每个节点遍历⼀次,所以总时间复杂度为O (n )AC Codestruct node { int left, right;};node tree[MAXN];left right _for (i, 1, n) cin >> tree[i].left >> tree[i].right;dfs(tree[id].left, deep+1);dfs(tree[id].right, deep+1);ans = max(ans, deep);return if (id == 0) return ;#include <iostream>#define _for(i, a, b) for (int i=(a); i<=(b); i++)using namespace std;const int MAXN = 1e6 + 10;struct node {int left, right;};node tree[MAXN];//存储结构定义int n, ans;void dfs(int id, int deep) {if (id == 0) return ;//到达叶⼦节点时返回ans = max(ans, deep);//更新答案dfs(tree[id].left, deep+1);//向左遍历dfs(tree[id].right, deep+1);//向右遍历}int main() {cin >> n;_for (i, 1, n) cin >> tree[i].left >> tree[i].right;//读⼊+建树dfs(1, 1);//从1号节点出发,当前深度为1cout << ans << endl;//输出答案return 0;//完结撒花!}Processing math: 100%。
实验报告:二叉树

实验报告:二叉树第一篇:实验报告:二叉树实验报告二叉树一实验目的1、进一步掌握指针变量,动态变量的含义;2、掌握二叉树的结构特性以及各种存储结构的特点及适用范围。
3、掌握用指针类型描述、访问和处理二叉树的运算。
4、熟悉各种存储结构的特征以及如何应用树结构解决具体问题。
二实验原理树形结构是一种应用十分广泛和重要的非线性数据结构,是一种以分支关系定义的层次结构。
在这种结构中,每个数据元素至多只有一个前驱,但可以有多个后继;数据元素之间的关系是一对多的层次关系。
树形结构主要用于描述客观世界中具有层次结构的数据关系,它在客观世界中大量存在。
遍历二叉树的实质是将非线性结构转为线性结构。
三使用仪器,材料计算机 2 Wndows xp 3 VC6.0四实验步骤【问题描述】建立一个二叉树,请分别按前序,中序和后序遍历该二叉树。
【基本要求】从键盘接受输入(按前序顺序),以二叉链表作为存储结构,建立二叉树(以前序来建立),并采用递归算法对其进行前序,中序和后序遍历,将结果输出。
【实现提示】按前序次序输入二叉树中结点的值(一个整数),0表示空树,叶子结点的特征是其左右孩子指针为空。
五实验过程原始记录基本数据结构描述; 2 函数间的调用关系;用类C语言描述各个子函数的算法;附录:源程序。
六试验结果分析将实验结果分析、实验中遇到的问题和解决问题的方法以及关于本实验项目的心得体会,写在实验报告上。
第二篇:数据结构-二叉树的遍历实验报告实验报告课程名:数据结构(C语言版)实验名:二叉树的遍历姓名:班级:学号:时间:2014.11.03一实验目的与要求1.掌握二叉树的存储方法2.掌握二叉树的三种遍历方法3.实现二叉树的三种遍历方法中的一种二实验内容• 接受用户输入一株二叉树• 输出这株二叉树的前根, 中根, 后根遍历中任意一种的顺序三实验结果与分析//*********************************************************** //头文件#include #include //*********************************************************** //宏定义#define OK 1 #define ERROR 0 #define OVERFLOW 0//*********************************************************** typedef struct BiTNode { //二叉树二叉链表存储结构char data;struct BiTNode *lChild,*rChild;}BiTNode,*BiTree;//******************************** *************************** int CreateBiTree(BiTree &T){ //按先序次序输入二叉中树结点的值,空格表示空树//构造二叉链表表示的二叉树T char ch;fflush(stdin);scanf(“%c”,&ch);if(ch==' ')T=NULL;else{ if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))return(OVERFLOW);T->data=ch;Creat eBiTree(T->lChild);CreateBiTree(T->rChild);} return(OK);} //********************************************************* void PreOrderTraverse(BiTree T){ //采用二叉链表存储结构,先序遍历二叉树的递归算法if(T){ printf(“%c”,T->data);PreOrderTraverse(T->lChild);PreOrd erTraverse(T->rChild);} } /***********************************************************/ void InOrderTraverse(BiTree T){ //采用二叉链表存储结构,中序遍历二叉树的递归算法if(T){ InOrderTraverse(T->lChild);printf(“%c”,T->data);InOrderT raverse(T->rChild);} }//*********************************************************** void PostOrderTraverse(BiTree T){ //采用二叉链表存储结构,后序遍历二叉树的递归算法if(T){ PostOrderTraverse(T->lChild);PostOrderTraverse(T->rChild) ;printf(“%c”,T->data);} }//*********************************************************** void main(){ //主函数分别实现建立并输出先、中、后序遍历二叉树printf(“please input your tree follow the PreOrder:n”);BiTNode *Tree;CreateBiTree(Tree);printf(“n先序遍历二叉树:”);PreOrderTraverse(Tree);printf(“n中序遍历二叉树:”);InOrderTraverse(Tree);printf(“n后序遍历二叉树:”);PostOrderTraverse(Tree);}图1:二叉树的遍历运行结果第三篇:数据结构二叉树操作验证实验报告班级:计算机11-2 学号:40 姓名:朱报龙成绩:_________实验七二叉树操作验证一、实验目的⑴ 掌握二叉树的逻辑结构;⑵ 掌握二叉树的二叉链表存储结构;⑶ 掌握基于二叉链表存储的二叉树的遍历操作的实现。
数据结构之二叉树(BinaryTree)

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

return(p); }
建立二叉树
以字符串的形式“根左子树右子树”定义 一棵二叉树
1)空树 2)只含一个根 结点的二叉树 A 3)
B C
A
以空白字符“ ”表示
以字符串“A ”表示
D
以下列字符串表示 AB C D
建立二叉树 A B C C
T
A ^ B ^ C^ ^ D^
D
建立二叉树
Status CreateBiTree(BiTree &T) {
1 if (!T) return;
2 Inorder(T->lchild, visit); // 遍历左子树 3 visit(T->data); } // 访问结点 4 Inorder(T->rchild, visit); // 遍历右子树
后序(根)遍历
若二叉树为空树,则空操
根
左 子树
右 子树
作;否则, (1)后序遍历左子树; (2)后序遍历右子树; (3)访问根结点。
统计二叉树中结点的个数
遍历访问了每个结点一次且仅一次
设置一个全局变量count=0
将visit改为:count++
统计二叉树中结点的个数
void PreOrder (BiTree T){ if (! T ) return; count++; Preorder( T->lchild); Preorder( T->rchild); } void Preorder (BiTree T,void( *visit)(TElemType& e)) { // 先序遍历二叉树 1 if (!T) return; 2 visit(T->data); // 访问结点 3 Preorder(T->lchild, visit); // 遍历左子树 4 Preorder(T->rchild, visit);// 遍历右子树 }
计算机二级公共基础专题探究——二叉树

公共基础专题探究——二叉树1.6 树与二叉树树是一种简单的非线性结构,所有元素之间具有明显的层次特性。
在树结构中,没有前件的结点只有一个,称为树的根结点,简称树的根。
每一个结点可以有多个后件,称为该结点的子结点。
没有后件的结点称为叶子结点。
在树结构中,一个结点所拥有的后件的个数称为该结点的度,所有结点中最大的度称为树的度。
为该结点的左子树与右子树。
二叉树的基本性质:必考的题目(1)在二叉树的第k层上,最多有2k-1(k≥1)个结点;(2)深度为m的二叉树最多有2m-1个结点;(3)度为0的结点(即叶子结点)总是比度为2的结点多一个;(4)二叉树中 n = n0 +n1 +n2k层上有2k-1个结点深度为m的满二叉树有2m-1个结点。
若干结点。
二叉树的遍历:(一般画个图要你把顺序写出来)后序遍历(访问根结点在访问左子树和访问右子树之后)重点题型:二叉树的遍历例1:某二叉树的前序序列为ABCD,中序序列为DCBA,则后序序列为(DCBA )。
【解析】前序序列为ABCD,可知A为根结点。
根据中序序列为DCBA可知DCB是A的左子树。
根据前序序列可知B是CD的根结点。
再根据中序序列可知DC是结点B的左子树。
根据前序序列可知,C是D的根结点,故后序序列为DCBA例2:对下列二叉树进行前序遍历的结果为 ABDYECFXZ例3:设二叉树如下,则后序序列为 DGEBHFCA【解析】本题中前序遍历为ABDEGCFH,中序遍历为DBGEAFHC,后序遍历为DGEBHFCA完全二叉树指除最后一层外,每一层上的结点数均达到最大值,在最后堆排序问题:例1:已知前序序列与中序序列均为ABCDEFGH,求后序序列【解析】设根节点为D≠0,左子树为L,右子树为R,有遍历顺序为:前:D-L-R 已知ABCDEFGH中:L-D-R 已知ABCDEFGH后:L-R-D 待求由此可知,L=0,D-R= ABCDEFGH故R-D=HGFEDCBA,即后序序列= HGFEDCBA变式训练1:已知后序序列与中序序列均为ABCDEFGH,求前序序列答案:HGFEDCBA,(这次R=0)结论:若前序序列与中序序列均为某序列,则后序序列为该序列的倒序,且为折线;同样地,若后序序列与中序序列均为某序列,则前序序列为该序列的倒序,且为折线例2:已知前序序列=ABCD,中序序列=DCBA,求后序序列【解析】设根节点为D≠0,左子树为L,右子树为R,有遍历顺序为:前:D-L-R 已知ABCD中:L-D-R 已知DCBA后:L-R-D 待求因为ABCD与DCBA正好相反,由此可知,R=0所以D-L=ABCD,即L-D=DCBA所以后序序列= DCBA变式训练2-1:中序序列=BDCA,后序序列=DCBA,求前序序列【解析】设根节点为D≠0,左子树为L,右子树为R,有遍历顺序为:前:D-L-R 待求中:L-D-R 已知BDC,A后:L-R-D 已知DCB,A通过观察可知,R=0,L={B,D,C},D=A中、后变换时,{B,D,C}发生了变化,说明左子树结构特殊,进一步令中’:L’-D’-R’已知B,DC后’:L’-R’-D’已知DC,B可知L’=0,即D’=B,R’= DC可以画出二叉树示意图为:Array所以前序序列= ABCD变式训练2-2:中序序列=ABC,后序序列=CBA,求前序序列【解析】设根节点为D≠0,左子树为L,右子树为R,有遍历顺序为:前:D-L-R 待求中:L-D-R 已知ABC后:L-R-D 已知通过观察可知,L=0,D-R=ABC,R-D=CBA所以前序序列=D-L-R= D-R=ABC变式训练2-3:前序序列=ABC,中序序列=CBA,求后序序列【解析】设根节点为D≠0,左子树为L,右子树为R,有遍历顺序为:前:D-L-R 已知A,BC中:L-D-R 已知CB,A后:L-R-D 待求通过观察可知,D=A ,L={B,C},R=0所以后序序列=CBA (一边偏)题型二:求二叉树的深度。
数据结构——- 二叉树

证明: 5.1 二叉树的概念
(1)总结点数为 ●二叉树的主要性质 n=n0+n1+n2 (2)除根结点外,每个 ●性质3: 结点都有一个边e进入 任何一棵二叉树,若其终端结点数为n0, n=e+1 度为2的结点数为n2,则n0=n2+1 (3)边e又是由度为1或2 A 的点射出,因此 e=n1+2n2 G B (4)由(2)(3) F C D n=n1+2n2+1 (5)由(4)-(1)可得 G n0=n2+1
《数据结构与算法》
★★★★★
第五章 二叉树
廊坊师范学院 数学与信息科学学院
树型结构--实例:五子棋
A
B
D
E
F
C
…...........
…...........
第五章 二叉树
本章重点难点
重点: 二叉树的定义,性质,存储结 构以及相关的应用——遍历,二叉搜 索树,堆优先 队列,Huffman树等 难点: 二叉树的遍历算法及相关应用
证明: 5.1 二叉树的概念
(1)总结点数为 ●二叉树的主要性质 n=n0+n1+n2 (2)除根结点外,每个 ●性质3: 结点都有一个边e进入 任何一棵二叉树,若其终端结点数为n0, n=e+1 度为2的结点数为n2,则n0=n2+1 (3)边e又是由度为1或2 A 的点射出,因此 e=n1+2n2 G B (4)由(2)(3) F C D n=n1+2n2+1 (5)由(4)-(1)可得 G n0=n2+1
A B C E D F G
证明: 由性质4可推出
由性质2(深度为k的 二叉树,至多有2k+1-1 个结点)可知,高度 为h(k+1)的二叉树,其 有n (n>0)个结点的完全二叉树的高度为 结点个数n满足: 「log2(n+1) ,深度为「log2(n+1) -1 2h-1-1<n<=2h-1 高度:二叉树中最大叶结点的层数+1 2h-1<n+1<=2h 取对数得到: 0层 1 h-1<log2(n+1)<=h 3 1层 2 因为h是整数,所以 h= log2(n+1) 5 2层 4
二叉树的各种基本运算的实现实验报告

二叉树的各种基本运算的实现实验报告
一、实验目的
实验目的为了深入学习二叉树的各种基本运算,通过操作实现二叉树的建立、存储、查找、删除、遍历等各种基本运算操作。
二、实验内容
1、构造一个二叉树。
我们首先用一定的节点来构建一棵二叉树,包括节点的左子节点和右子节点。
2、实现查找二叉树中的节点。
在查找二叉树中的节点时,我们根据二叉树的特点,从根节点开始查找,根据要查找的节点的值与根节点的值的大小的关系,来决定接下来查找的方向,直到找到要查找的节点为止。
3、实现删除二叉树中的节点。
在删除二叉树节点时,我们要做的是找到要删除节点的父节点,然后让父节点的链接指向要删除节点的子节点,有可能要删除节点有一个子节点,有可能有两个极点,有可能没有子节点,我们要根据每种情况进行处理,来保持二叉树的结构不变。
4、对二叉树进行遍历操作。
二叉树的遍历有多种方法,本实验使用的是先序遍历。
首先从根节点出发,根据先序遍历的顺序,先访问左子树,然后再访问右子树,最后访问根节点。
三、实验步骤
1、构建二叉树:
我们用一个数组代表要构建的二叉树,第一项为根节点,第二项和第三项是根节点的子节点。
树的存储结构、遍历;二叉树的定义、性质、存储结构、遍历以及树、森林、二叉树的转换

树和二叉树树与二叉树是本书的重点内容之一,知识点多且比较零碎。
其中二叉树又是本章的重点。
在本章中我们要了解树的定义、熟悉树的存储结构、遍历;二叉树的定义、性质、存储结构、遍历以及树、森林、二叉树的转换。
哈夫曼树及哈夫曼编码等内容。
算法的重点是二叉树的遍历及其应用。
6.1 树的定义一、树的定义树:树是n(n>0)个结点的有限集合T。
一棵树满足下列条件:(1)有且仅有一个称为根的结点;(2)其余结点可分为m(m>=0)棵互不相交的有限集合T1,T2,T3,…Tm,其中每个集合又是一棵树,并称之为根的子树。
有关树的一些基本概念:1)结点的度:树中每个结点具有的子树数目或后继结点数。
如图中结点A的度为2,B的度为32) 树的度:所有结点的度的最大值为树的度。
(图中树的度为3)3) 分支结点:即:树中所有度大于0的结点。
4) 叶子结点:即:树中度为零的结点,也称为终端结点。
5) 孩子结点:一个结点的后续结点称为该结点的孩子结点。
6) 双亲结点:一个结点为其后继结点的双亲结点。
7) 子孙结点:一个结点的所有子树中的结点为该结点的子孙结点。
8) 祖先结点:从根结点到一个结点的路径上所有结点(除自己外)称为该结点的祖先结点。
(如A和B为D结点的祖先结点)9) 兄弟结点:具有同一父亲的结点互相为兄弟结点。
(如B和C为兄弟结点)10) 结点的层数:从根结点到该结点的路径上的结点总数称为该结点的层数(包括该结点)。
11) 树的深度(高度):树中结点的最大层数为树的深度。
(图中树的深度为4)12) 森林:0个或多个互不相交的树的集合。
上图中:树的度为3,树的深度为4。
结点A,B,C,D,E,F,G,H,I,J的度分别为:2, 3, 2, 0 ,2 , 0, 0, 0, 0, 0叶结点有:D, F, G, H, I, JB,C为兄弟,D, E, F为兄弟,F, G为兄弟。
I,J为兄弟。
二、树的表示1. 树的逻辑结构描述Tree=(D,R)其中:D为具有相同性质的数据元素的集合。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ if ( T )
{ //如果二叉树不为空
Inorder ( T -> lchild ) ; //中序遍历左子树
printf( T -> data) ;
//输出根结点
Inorder ( T -> rchild ) ; //中序遍历右子树
// 左右孩子指针
} BiTNode, *BiTree;
2)三叉链表
例2:对例1
root
lchild
结点结构 data parent rchild
A
B
D
C
E
F
类型定义
typedef struct TriTNode { // 结点结构 TElemType data; struct TriTNode *lchild, *rchild;
Preorder ( T -> rchild ) ; //先序遍历右子树
}
}
2)中序遍历算法
若二叉树为空,则空操作;
否则,
中序遍历左子树; 访问根结点;
D
L
RБайду номын сангаас
中序遍历右子树。
例3: 中序遍历
L
D
R
A
A
B
C
LD R
L DR
□
D
□
□
□
□
B
C
L DR
中序遍历序列:B D A C
D
递归算法描述
void Inorder ( BiTree T )
// 左右孩子指针
struct TriTNode *parent; //双亲指针 } TriTNode, *TriTree;
例3: 链式存储结构示例
A
B
C
DE A
F A∧
B
∧C
B
∧C
∧ D ∧ ∧ E ∧ ∧ F ∧ ∧ D ∧ ∧∧ E ∧∧ ∧∧ F ∧∧
二叉链表
三叉链表
注意:对于一棵二叉树,若采用二叉链表
例1: 完全二叉树存储
1
2
3
4
5
6
7
8
9 10
1 2 3 4 5 6 7 8 9 10
例2: 非完全二叉树存储
1
A
2
B
5C
3
D
7
E
14
F
1 2 3 4 5 6 7 8 9 10 11 12 13 14
AB D 0 C 0 E 0 0 0 0 0 0F
注意:1)对于一棵二叉树,若采用顺序存储
时,对完全二叉树,比较方便;对非完全二 叉树,将会浪费大量存储单元。
存储时,当二叉树为非完全二叉树时,比较 方便,若为完全二叉树时,将会占用较多存 储单元(存放地址的指针)。
若一棵二叉树有n个结点,采用二叉链表作 存储结构时,共有2n个指针域,其中只有n1个?指针指向左右孩子,其余n+1个指? 针为 空。
在二叉链表结构中的操作
查询元素? 查询元素的后继? 查询元素的前驱?
【重点难点】
遍历二叉树的递归算法及其应用 ,二叉树线索化
【教学内容】
§6.2.3 二叉树的存储结构 §6.3.1 遍历二叉树 §6.3.2 线索二叉树
【内容回顾】
6.1 树的定义和基本术语 6.2 二叉树
-6.2.1 二叉树的定义 -6.2.2 二叉树的性质
【课题导入】
回顾线性表的存储方法? 顺序存储 链式存储
§6.2.3 二叉树的存储结构
1. 顺序存储结构
约定用一组地址连续的存储单元依次自上而 下,自左至右存储完全二叉树上的结点元素。
#define MAX_TREE_SIZE 100 // 二叉树的最大结点数 typedef TElemType SqBiTree[MAX_TREE_SIZE];
// 0号单元存储根结点 SqBiTree bt;
根据二叉树的结构,分为三部分:
L 左子树
D 根结点 R 右子树
遍历二叉树的方法:
D
L
R
先序遍历 DLR 中序遍历 LDR 后序遍历 LRD
由于其中的左右子树也是二叉树,属于递归
结构,所以常常借助递归算法实现。
1)先序遍历算法
若二叉树为空,则空操作;
否则,
访问根结点; 先序遍历左子树;
对“二叉树”而言,可以有两 条搜索路径:
➢ 先上后下的按层次遍历; ➢ 先左(子树)后右(子树)
的遍历;
2、先上后下的按层次遍历
从第一层开始,同一层从左到右。
例1:如右图 按层次遍历序列为: ABFCGDEH
A B
C DE
F G
H
特点:先被遍历的结点的孩子先于后遍历 的结点的孩子遍历。
3、先左后右的遍历算法
2)最坏的非完全二叉树是只有右分支,设 高度为K,则需占用2K?-1个存储单元,而实 际只有k个元素,实际只需k个存储单元。
因此,对于非完全二叉树,不宜采用顺 序存储结构。
顺序结构存储二叉树的优点
1)存储时,元素的位置(下标+1)对应 其在完全二叉树中的序号。
2)可快速方便地访问元素的双亲和左 右孩子。
【学习目标】
1.熟练掌握二叉链表存储结构; 2.熟练掌握遍历二叉树的递归算法,并能够实现二叉树的其它 操作; 3.了解按层次遍历二叉树的算法,能够熟练写出给定二叉树的 各种遍历序列,会根据给定的遍历序列画出二叉树。 4. 理解二叉树线索化的实质是建立结点与其在相应序列中的前 驱或后继之间的直接联系。了解二叉树的线索化过程以及在中 序线索化树上找给定结点的前驱和后继的方法。能够熟练地画 出给定二叉树的各种线索。
2、链式存储表示
1)二叉链表 2)三叉链表
1) 二叉链表
例1:
A
root
结点结构 lchild data rchild
A
B
D
C
E
F
B C
D E
F
类型定义
typedef struct BiTNode { // 结点结构 TElemType data; struct BiTNode *lchild, *rchild;
D
L
R
先序遍历右子树。
例2: 先序遍历
A
B
C
D
L
R
A D LR
D LR
□
D
□
□
B
□
□
先序遍历序列:A B D C
C D LR
D
递归算法描述
void Preorder ( BiTree T )
{ if ( T )
{ //如果二叉树不为空
printf( T -> data) ;
//输出根结点
Preorder ( T -> lchild ) ; //先序遍历左子树
这种存储结构的特点是: 寻找孩子结点容易,双亲比较困难。
§6.3.1 遍历二叉树
1、导入 2、先上后下的按层次遍历 3、先左后右的遍历算法 4、遍历二叉树的应用
1、导入
问题:怎样在二叉树中查找具有某种特征的结点? 怎样对二叉树中全部结点逐一进行某种处理?
遍历二叉树:即如何按照某条搜索路径巡访二叉树 中每个结点,使得每个结点均被访问一次,而且仅 被访问一次。 “访问”的含义可以很广,如:输出结点的信息, 对结点进行统一的操作等。