数据结构与算法 第四章 树与二叉树幻灯片.ppt
《数据结构与算法 第四章 树与二叉树幻灯片.ppt》由会员分享,可在线阅读,更多相关《数据结构与算法 第四章 树与二叉树幻灯片.ppt(75页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构与算法 第四章 树与二叉树10/2/20221第1页,共75页,编辑于2022年,星期六第4章 树与二叉树l4.14.1 树的基本概念树的基本概念l4.2 4.2 二叉树二叉树l4.34.3 二叉树的遍历二叉树的遍历l4.44.4 线索二叉树线索二叉树l4.54.5 树和森林树和森林l4.64.6 哈夫曼树哈夫曼树10/2/20222第2页,共75页,编辑于2022年,星期六4.1 树的基本概念4.1.1树的定义及表示树:n个结点的有限集(n=0)Root树根子树子树10/2/20223第3页,共75页,编辑于2022年,星期六4.1.2 树的常用术语及运算l树的结点l结点的度-结点拥
2、有的子树的个数l叶子结点-度为0的结点,又称终端结点l分枝结点-度不为0的结点l树的度-树内结点度的最大值l树的层次-第一层从根结点开始,根的孩子在第二层,依此类推l树的深度-树中结点的最大层次ADEBCFHIGJKM10/2/20224第4页,共75页,编辑于2022年,星期六4.1.2 树的常用术语及运算l孩子(结点)-结点的子树的根结点l双亲(结点)-结点作为根结点的子树的根结点l兄弟(结点)-同一个双亲的孩子结点之间互为兄弟l祖先-从根结点到该结点所经分枝上的所有结点l子孙-以某结点为根的子树中的任一结点都是该结点的子孙ADEBCFHIGJK10/2/20225第5页,共75页,编辑于
3、2022年,星期六4.1.2 树的常用术语及运算l树的基本运算(1)setnull(T):初始化操作,置T为空树。(2)求根结点ROOT(T)或ROOT(x)。求树T的根或求结点x所在的树的根结点。若T是空树或x不在任何一棵树上,则函数值为“空”。(3)求双亲结点RARENT(T,x)。求树T中结点x的双亲结点。若结点x是树T的根结点或结点x不在树T中,则函数值为“空”。(4)求孩子结点CHILD(T,x,i)。求树T中结点x的第i个孩子结点。若结点x是树T的叶子或无第i个孩子或结点x不在树T中,则函数值为“空”。(5)建树creat(x,F)。生成以x结点为根、以森林F为子树森林的树。(6)
4、求右兄弟结点RIGHT_SIBLING(T,x)。求树T中结点x右边的兄弟。若结点x是其双亲的最右边的孩子结点或结点x不在树T中,则函数值为“空”。10/2/20226第6页,共75页,编辑于2022年,星期六4.1.2 树的常用术语及运算l树的基本运算(7)插入子树操作addchild(y,i,x)。置以结点x为根的树为结点y的第i棵子树。若原树中无结点y或结点y的子树个数i-1,则空操作。(8)删除子树操作delchild(x,i)。删除结点x的第i棵子树。若无结点x或结点x的子树个数data;10/2/202223第23页,共75页,编辑于2022年,星期六4.2.4 二叉树的简单运算实
5、现(2)建立二叉树操作建立二叉树操作bitree create(elemtype x,bitree lbt,bitree rbt)/*该该运运算算生生成成一一棵棵以以x为为根根结结点点,lbt和和rbt分别为左右子树的二叉树分别为左右子树的二叉树*/bitree p;p=(bitree)malloc(sizeof(bitnode);p-data=x;p-lchild=lbt;p-rchild=rbt;return p;/*返回建成的二叉树返回建成的二叉树*/10/2/202224第24页,共75页,编辑于2022年,星期六4.2.4 二叉树的简单运算实现(3)插入左孩子:void add_lc
6、hild(bitree bt,elemtp x)bitree p;p=(bitree)malloc(sizeof(bitnode);p-data=x;p-lchild=NULL;p-rchild=NULL;bt-lchild=p;/*插入插入bt的左孩子域的左孩子域*/10/2/202225第25页,共75页,编辑于2022年,星期六4.2.4 二叉树的简单运算实现(4)删除左孩子:void delete_lchild(bitree bt)bitree p;p=bt-lchild;*保存左子树指针保存左子树指针*/bt-lchild=NULL;free(p);/*释放左子树空间释放左子树空间*
7、/10/2/202226第26页,共75页,编辑于2022年,星期六4.3二叉树的遍历l二叉树遍历:即如何按某条搜索路径巡访树中每个结点,使得每个结点均被访问次而且仅被访问次。l主要有以下几种:l先序遍历 l中序遍历 l后序遍历 l层次遍历 10/2/202227第27页,共75页,编辑于2022年,星期六4.3二叉树的遍历l先序遍历若二叉树为空,则空操作,否则,(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树 ADEBCFHIGJKL12345678 9101112BDHIEJKGLFCA10/2/202228第28页,共75页,编辑于2022年,星期六4.3二叉树的遍历l中序遍
8、历l若二叉树为空,则空操作;否则,(1)中序遍历左子树;(2)访问根结点,(3)中序遍历右子树。ADEBCFHIGJKL12345678 9101112DIBAJEKGCFLH10/2/202229第29页,共75页,编辑于2022年,星期六4.3二叉树的遍历l后序遍历 若二叉树为空,则空操作;否则,(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。ADEBCFHIGJKL12345678 9101112IDJKEBLACGFH10/2/202230第30页,共75页,编辑于2022年,星期六4.3二叉树的遍历l层次遍历:若二叉树为空,则空操作;否则,从根结点开始,自顶向下访问各层
9、,从左到右访问同一层的结点。ADEBCFHIGJKL12345678 9101112BCDEFGHLKJIA10/2/202231第31页,共75页,编辑于2022年,星期六4.3.1 遍历二叉树的递归算法(1)先序遍历二叉链表的递归算法:voidpreorder(bitreebt)if(bt=NULL)return;/*递归结束条件递归结束条件*/elseprintf(“%dt”,bt-data);/*前序遍历左子树前序遍历左子树*/preorder(bt-lchild);/*前序遍历右子树前序遍历右子树*/preorder(bt-rchild);ADEBCFHIGJKL12345678 9
10、10111210/2/202232第32页,共75页,编辑于2022年,星期六4.3.1 遍历二叉树的递归算法(1)先序遍历二叉链表的递归算法:preorder(A)if(A=NULL)return;else printf(“A”);preorder(B);preorder(C);preorder(B)if(B=NULL)return;else printf(“B”);preorder(D);preorder(E);preorder(D)if(B=NULL)return;else printf(“D”);preorder(H);preorder(I);preorder(H)10/2/20223
11、3第33页,共75页,编辑于2022年,星期六4.3.1 遍历二叉树的递归算法(2)中序遍历二叉链表的递归算法:voidinorder(bitreebt)if(bt=NULL)return;/*递归结束条件递归结束条件*/else/*中序遍历左子树中序遍历左子树*/inorder(bt-lchild);/*访问根结点访问根结点*/printf(“%dt”,bt-data);/*中序遍历右子树中序遍历右子树*/inorder(bt-rchild);ADEBCFHIGJKL12345678 910111210/2/202234第34页,共75页,编辑于2022年,星期六4.3.1 遍历二叉树的递归
12、算法(3 3)后序遍历二叉链表的递归算法:)后序遍历二叉链表的递归算法:voidpostorder(bitreebt)if(bt=NULL)return;/*递归结束条件递归结束条件*/elsepostorder(bt-lchild);/*后序遍历左子树后序遍历左子树*/postorder(bt-rchild);/*后序遍历右子树后序遍历右子树*/printf(“%dt”,bt-data);/*访问根结点访问根结点*/ADEBCFHIGJKL12345678 910111210/2/202235第35页,共75页,编辑于2022年,星期六4.3.2 遍历二叉树的非递归算法l使用栈或队列,可以实
13、现二叉树遍历的非递归算法。l(1)先序遍历二叉链表的非递归算法:#defineMAXSIZE100voidnrpreorder(bitreebt)bitreestackMAXSIZE,p;inttop=0;p=bt;dowhile(p!=NULL)printf(“%dt”,p-data);if(p-rchild!=NULL)/*如果右子树不空如果右子树不空*/stack+top=p-rchild;/*右孩子进栈右孩子进栈*/p=p-lchild;if(top0)p=stacktop-;while(top0);/*当栈不空时继续遍历当栈不空时继续遍历*/ADEBCFHIGJKL12345678
14、9101112思路:沿左子树一直深入,并把所遇到结点的非空右孩子进栈;访问完左孩思路:沿左子树一直深入,并把所遇到结点的非空右孩子进栈;访问完左孩子后,将右孩子出栈遍历其右子树。子后,将右孩子出栈遍历其右子树。10/2/202236第36页,共75页,编辑于2022年,星期六4.3.2 遍历二叉树的非递归算法l(2)中序遍历二叉链表的非递归算法:#defineMAXSIZE100voidnrinorder(bitreebt)bitreestackMAXSIZE,p;inttop=0;p=bt;dowhile(p!=NULL)stack+top=p;/*所遇结点进栈所遇结点进栈*/p=p-lch
15、ild;/*继续搜索继续搜索p的左子树的左子树*/if(top0)p=stacktop-;/*出栈一个结点出栈一个结点*/printf(“%dt”,p-data);/*访问结点访问结点*/p=p-rchild;/*继续搜索右子树继续搜索右子树*/while(top0);ADEBCFHIGJKL12345678 9101112思路:与前序遍历类同,只是沿左子树向下搜索的过程中先将所遇结点进思路:与前序遍历类同,只是沿左子树向下搜索的过程中先将所遇结点进栈,待遍历完左子树返回时从栈顶退出结点并访问,然后再遍历右子树。栈,待遍历完左子树返回时从栈顶退出结点并访问,然后再遍历右子树。10/2/2022
16、37第37页,共75页,编辑于2022年,星期六4.3.2 遍历二叉树的非递归算法(3)二叉树的层次遍历:void layer_travel_bitree(bitree*bt)bitree*p;/初始化队列Q,队列的元素为指向bitree结点的指针类型 init_Queue(Q);/根结点地址入队in_queue(Q,bt);while(!queue_empty(Q)p=out_queue(Q);/出队 visit(p);/左孩子结点地址入队 if(p-lp!=NULL)in_queue(Q,p-lp);/右孩子结点地址入队 if(p-rp!=NULL)in_queue(Q,p-rp);ADE
17、BCFHIGJKL12345678 910111210/2/202238第38页,共75页,编辑于2022年,星期六4.3.3 遍历序列与二叉树的复原l必需至少提供2个不同的遍历序列,才能复原唯一的二叉树。1.利用前序序列和中序序列恢复二叉树例:前序ABDCEFG 中序DBAFEGC思路:前序序列确定根结点 中序列确定左子树和右子树10/2/202239第39页,共75页,编辑于2022年,星期六4.3.3 遍历序列与二叉树的复原2.利用后序序列和中序序列恢复二叉树例:后序DBFGECA 中序DBAFEGC思路:后序序列确定根结点 中序序列确定左子树和右子树10/2/202240第40页,共7
18、5页,编辑于2022年,星期六4.3.3 遍历序列与二叉树的复原l必需至少提供2个不同的遍历序列,才能复原唯一的二叉树。1.利用前序序列和中序序列恢复二叉树例:前序ABDCEFG 中序DBAFEGC10/2/202241第41页,共75页,编辑于2022年,星期六4.3.4 基于遍历的几种二叉树运算的 实现和应用举例1.查找结点x的运算2.求二叉树中的叶子结点数目3.求二叉树的高度10/2/202242第42页,共75页,编辑于2022年,星期六1.查找结点x的运算l查找二叉树bt中的结点x,可以结合在四种遍历算法中的任何一个算法中进行。在此我们以前序遍历来实现查找运算的递归算法。bitree
19、 search(bitree bt,elemtype x)if(bt!=NULL)if(bt-data=x)return bt;search(bt-lchild,x);/*在左子树中查找*/search(bt-rchild,x);/*在右子树中查找*/else return NULL;10/2/202243第43页,共75页,编辑于2022年,星期六2.求二叉树中的叶子结点数目 l在遍历过程中对所遇结点判断是否为叶子结点,若是则统计变量加1,直到遍历完所有结点,叶子结点总数即可求得。下面给出利用中序遍历求叶子结点数的递归算法:int countleaf(bitree bt)int num=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构与算法 第四章 树与二叉树幻灯片 数据结构 算法 第四 二叉 幻灯片
限制150内