版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 树和二叉树 说明: 树是一类重要的非线性数据结构,是以分支关系定义的层次结构6.1 树的定义定义v定义:树(tree)是n(n=0)个结点的有限集T。在任意一棵非空树中:l有且仅有一个特定的结点,称为树的根(root)l当n1时,其余结点可分为m(m0)个互不相交的有限集T1,T2,Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree)v特点:l非空树中至少有一个结点根l树中各子树是互不相交的集合A只有根结点的树ABCDEFGHIJKLM有子树的树根子树空树基本术语v结点(node) 表示树中的元素,包括数据项及若干指向其子树的分支v结点的度(degree) 结点拥有的子树
2、数v叶子(leaf) 度为0的结点。(或称为终端结点)v孩子(child) 结点子树的根称为该结点的孩子v双亲(parents) 孩子结点的上层结点叫该结点的v兄弟(sibling) 同一双亲的孩子v树的度 一棵树中最大的结点度数v结点的层次(level) 从根结点算起,根为第一层,它的孩子为第二层v深度(depth) 树中结点的最大层次数v森林(forest) m (m0)棵互不相交的树的集合ABCDEFGHIJKLM结点A的度:3结点B的度:2结点M的度:0叶子:K,L,F,G,M,I,J结点A的孩子:B,C,D结点B的孩子:E,F结点I的双亲:D结点L的双亲:E结点B,C,D为兄弟结点K
3、,L为兄弟树的度:3结点A的层次:1结点M的层次:4树的深度:4结点F,G为堂兄弟结点A是结点F,G的祖先bacghdefijabdeijfcghijdghfabcea ( b ( d, e ( i, j ),f), c ( g, h ) ) 树的存储结构 1. 双亲表示法双亲表示法l实现:结构数组存放树的结点,每个结点含两个域u数据域:存放结点本身信息u双亲域:指示本结点的双亲结点在数组中位置l特点:找双亲容易,找孩子难typedef struct node datatype data; int parent;JD;JD tM;abcdefhgiacdefghib01223555109601
4、2345789dataparent0号单元不用或存结点个数如何找孩子结点 2. 孩子表示法孩子表示法l多重链表法多重链表法:每个结点有多个指针域,分别指向其子树的根u结点同构:结点的指针个数相等,为树的度Du结点不同构:结点指针个数不等,为该结点的度d data child1 child2 . childDdata degree child1 child2 . childd 2. 孩子表示法孩子表示法l孩子链表法:孩子链表法:每个结点的孩子结点用单链表存储,再用含n个元素的结构数组指向每个孩子链表。孩子结点:typedef struct node int child; /该结点在表头数组中下标
5、 struct node *next; /指向下一孩子结点 JD;表头结点:typedef struct tnode datatype data; /数据域 struct node *fc; /指向第一个孩子结点 TD; TD tM; /t0不用abcdefhgi6012345789acdefghibdatafc 2 3 4 5 9 7 8 6如何找双亲结点child next3. 带双亲的孩子链表带双亲的孩子链表612345789acdefghibdatafc 2 3 4 5 9 7 8 6012235551parentabcdefhgi 4. 孩子兄弟表示法(二叉树表示法)孩子兄弟表示法(
6、二叉树表示法)l实现:用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其第一个孩子结点和下一个兄弟结点l特点u操作容易u破坏了树的层次typedef struct node datatype data; struct node *fch, *nsib;JD;abcdefhgi a b c d e f g h i6.2 二叉树定义v定义:二叉树是n(n0)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成v特点l每个结点至多有二棵子树(即不存在度大于2的结点)l二叉树的子树有左、右之分,且其次序不能任意颠倒v基本形态A只有根结点的二
7、叉树空二叉树AB右子树为空AB左子树为空ABC左、右子树均非空二叉树性质v性质1:) 1(21iii个结点层上至多有在二叉树的第证明:用归纳法证明之 i=1时,只有一个根结点, 是对的 假设对所有j(1j1,则其双亲是则其双亲是 i/2 (2) 如果如果2in,则结点则结点i无左孩子;如果无左孩子;如果2i n,则则其左孩子是其左孩子是2i (3) 如果如果2i+1n,则结点则结点i无右孩子;如果无右孩子;如果2i+1 n,则其右孩子是则其右孩子是2i+1l性质性质u性质性质4:1log2nn深度为个结点的完全二叉树的具有 从以上性质可以得到:从以上性质可以得到:(1)n个结点的二叉树最多有n
8、层,最少有 log2n +1层(完全二叉树达到最小值)(2)完全二叉树中度为1的结点最多1个(3)具有n个结点的完全二叉树编号最大的非叶结点是n/2,编号最小的叶结点是n/21(4)完全二叉树中度为1的结点数为(n+1)mod 2,度为0的结点数为n/2 ,度为2的结点数为n/2 -1二叉树的存储结构顺序存储结构l实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素l特点:u结点间关系蕴含在其存储位置中u浪费空间,适于存满二叉树和完全二叉树abcdefga b c d e 0 0 0 0 f g 1 2 3 4 5 6 7 8 9 10 11链式存储结构l二叉链表typedef stru
9、ct node datatype data; struct node *lchild, *rchild;JD;lchild data rchild ABCDEFG在n个结点的二叉链表中,有n+1个空指针域 AB C D E F G空指针个数:2*n0+1*n1+0*n2=2n0+n1=n0+n1+n0=n0+n1+n2+1=n+1三叉链表typedef struct node datatype data; struct node *lchild, *rchild, *parent;JD;lchild data parent rchildABCDEFG A B C D E F G6.3 树与二叉
10、树转换ACBED树ABCDE二叉树 A B C D E A B C D E A B C D E 对应存储存储解释解释v将树转换成二叉树l加线:在兄弟之间加一连线l抹线:对每个结点,除了其左孩子外,去掉它与其余孩子之间的关系l旋转:以树的根结点为轴心,将整树顺时针转45ABCDEFGHIABCDEFGHIABCDEFGHIABCDEFGHIABCDEFGHI树转换成的二叉树其右子树一定为空v将二叉树转换成树l加线:若p结点是双亲结点的左孩子,则将p的右孩子,右孩子的右孩子,沿分支找到的所有右孩子,都与p的双亲用线连起来l抹线:抹掉原二叉树中双亲与右孩子之间的连线l调整:将结点按层次排列,形成树结
11、构ABCDEFGHIABCDEFGHIABCDEFGHIABCDEFGHIABCDEFGHIv森林转换成二叉树l将各棵树分别转换成二叉树l将每棵树的根结点用线相连l以第一棵树根结点为二叉树的根,再以根结点为轴心,顺时针旋转,构成二叉树型结构ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJv二叉树转换成森林l抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成孤立的二叉树l还原:将孤立的二叉树还原成树ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ6.4 树和二叉树的遍历树的遍历v遍历按一定规律
12、走遍树的各个顶点,且使每一顶点仅被访问一次,即找一个完整而有规律的走法,以得到树中所有结点的一个线性排列v常用方法l先根(序)遍历:先访问树的根结点,然后依次先根序遍历根的每棵子树l后根(序)遍历:先依次后根序遍历每棵子树,然后访问根结点l按层次遍历:先访问第一层上的结点,然后依次遍历第二层,第n层的结点ABCDEFGHIJKLMNO先序遍历:后序遍历:层次遍历:ABE F I GCDHJ KL NOME I F G B C J K N O L M H D AAB C DE F GH I J KL MNO二叉树的遍历v方法l先序遍历:先访问根结点,然后分别先序遍历左子树、右子树l中序遍历:先中
13、序遍历左子树,然后访问根结点,最后中序遍历右子树l后序遍历:先后序遍历左、右子树,然后访问根结点l按层次遍历:从上到下、从左到右访问各结点DLRLDR、LRD、DLRRDL、RLD、DRLADBCD L RAD L RD L RBDCD L R先序遍历序列:A B D C先序遍历:ADBCL D RBL D RL D RADCL D R中序遍历序列:B D A C中序遍历:ADBC L R DL R DL R DADCL R D后序遍历序列: D B C A后序遍历:B-+/a*b-efcd先序遍历:中序遍历:后序遍历:层次遍历:- + a * b - c d / e f-+a*b-cd/ef
14、- +a *b - c d/e f-+a*b-c d/e fv算法l递归算法void preorder(JD *bt) if(bt!=NULL) printf(%dt,bt-data); preorder(bt-lchild); preorder(bt-rchild); 主程序主程序Pre( T )返回返回pre(T R);返回返回pre(T R);ACBDTBprintf(B);pre(T L);BTAprintf(A);pre(T L);ATDprintf(D);pre(T L);DTCprintf(C);pre(T L);C返回T左是空返回pre(T R);T左是空返回T右是空返回T左是
15、空返回T右是空返回pre(T R);先序序列:A B D Cl非递归中序算法ABCDEFGpiP-A(1)ABCDEFGpiP-AP-B(2)ABCDEFGpiP-AP-BP-C(3)p=NULLABCDEFGiP-AP-B访问:C(4)pABCDEFGiP-A访问:C B(5)ABCDEFGiP-AP-D访问:C Bp(6)ABCDEFGiP-AP-DP-E访问:C Bp(7)ABCDEFGiP-AP-D访问:C B Ep(8)ABCDEFGiP-AP-DP-G访问:C B EP=NULL(9)ABCDEFGiP-A访问:C B E G Dp(11)ABCDEFGiP-AP-F访问:C B
16、E G Dp(12)ABCDEFGiP-AP-D访问:C B E Gp(10)ABCDEFGiP-A访问:C B E G D Fp=NULL(13)ABCDEFGi访问:C B E G D F Ap(14)ABCDEFGi访问:C B E G D F Ap=NULL(15)v二叉树的建立v方法一方法一:l按先序遍历序列建立二叉树的二叉链表,已知先序序列为: A B C D E G F ABCDEFG A B C D E F G 遍历算法的应用二叉树的建立:二叉树的建立: 方法二方法二: 将二叉树模拟为完全二叉树,从将二叉树模拟为完全二叉树,从根结点开始对结点进行编号,编号从根结点开始对结点进行
17、编号,编号从1开始开始。在运行过程中要求输入结点对应的编号。在运行过程中要求输入结点对应的编号和值时,按下页图示(和值时,按下页图示(c)中的数据输入,)中的数据输入,最后以编号最后以编号i=0;结点值;结点值x=$结束。结束。abcdefghabcdefgh12345101123ix123451011230ABCDEFGH$(a)(b)(c)JD *creatbt() JD *q; struct node *s50; /*建立建立指针指针数组数组s*/ int i,j,x; printf (建立二叉树,输入结点对应的编号和值建立二叉树,输入结点对应的编号和值nn); printf (i,x=
18、); scanf (%d%c,&i,&x); while (i!=0 & x!=$) q=(jd*) malloc (sizeof(jd); q-data=x;q-lchild=null;q-rchild=null; si=q; /*结点结点q的地址存入数组中的地址存入数组中*/ if ( i!=1) /*此结点不是根结点此结点不是根结点*/ j=i/2; /*确定其双亲结点在数组中的位置确定其双亲结点在数组中的位置*/ if (i%2=0) sj-lchild=q; else sj-rchild=q; printf (i,x=); scanf (%d,%c,&
19、i,&x); return s1; /*s1中存放着根结点中存放着根结点*/ 结点类型定义结点类型定义:typedef struct node char data; struct node *lchild, *rchild; JD;l求二叉树深度算法l统计二叉树中叶子结点个数算法遍历算法的应用线索二叉树v定义:l前驱与后继:在二叉树的先序、中序或后序遍历序列遍历序列中两个相邻的结点互称为l线索:指向前驱或后继结点的指针称为l线索二叉树:加上线索的二叉链表二叉链表表示的二叉树叫l线索化:对二叉树按某种遍历次序使其变为线索二叉树的过程叫v实现l在有n个结点的二叉链表中必定有n+1个空链域l
20、在线索二叉树的结点中增加两个标志域ult :若 lt =0, lc 域指向左孩子;若 lt=1, lc域指向其前驱urt :若 rt =0, rc 域指向右孩子;若 rt=1, rc域指向其后继l结点定义:typedef struct node int data; int lt, rt; struct node *lc, *rc;JD; lc lt data rt rcABCDE A B D C ET先序序列:ABCDE先序线索二叉树00001111 11ABCDE A B D C ET中序序列:BCAED中序线索二叉树0000111111ABCDE A B D C ET后序序列:CBEDA后
21、序线索二叉树0000111111ABCDE 0 A 0 1 B 0 0 D 1 1 C 1 1 E 1 T中序序列:BCAED带头结点的中序线索二叉树 0 1头结点:lt=0, lc指向根结点rt=1, rc指向遍历序列中最后一个结点遍历序列中第一个结点的lc域和最后一个结点的rc域都指向头结点 A B D C ET中序序列:BCAED中序线索二叉树0000111111v算法l按中序线索化二叉树Ch5_20.cABCDEt 0 1prpiP-A A B D C Ebt0000000000JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)m
22、alloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二
23、叉树Ch5_20.cABCDE A B D C Ebtt 0 1prpiP-AP-B0000000000JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc
24、=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C Ebtt 0 1prP=NULLiP-AP-B0000000000JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p
25、=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C Ebtt 0 1prPiP-A输出:BJD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int
26、i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(
27、t);00000000001v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C Ebtt 0 1prP输出:BiP-AP-C0000100000JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NU
28、LL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C Ebtt 0 1prP=NULLiP-AP-C输出:B0000100000JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NU
29、LL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C Ebtt 0 1prPiP-A输出: B C 000
30、01000001JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while
31、(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C Ebtt 0 1prP=NULLiP-A输出: B C 0000100010JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; i
32、f(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C Ebtt 0 1prPi输出: B C A 00001000101JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeo
33、f(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cA
34、BCDE A B D C Ebtt 0 1Pi输出: B C A prP-D0000101010JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NUL
35、L) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C Ebtt 0 1Pi输出: B C A prP-DP-E0000101010JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t;
36、p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C Ebtt 0 1P=NULLi输出: B C A prP-DP-E0000101010JD *zxxsh(JD *b
37、t) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t;
38、pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C Ebtt 0 1Pi输出: B C A E prP-D0000101010 1JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c
39、 ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C Ebtt 0 1P=NULLi输出: B C A E prP-D0000101011JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0
40、; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C
41、Ebtt 0 1Pi输出: B C A E D pr00001010111JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; do while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1;
42、 pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树Ch5_20.cABCDE A B D C Ebtt 0 1P=NULLi输出: B C A E D pr00001011111JD *zxxsh(JD *bt) JD *p,*pr,*sM,*t; int i=0; t=(JD *)malloc(sizeof(JD); t-lt=0; t-rt=1; t-rc=t; if(bt=NULL) t-lc=t; else t-lc=bt; pr=t; p=bt; d
43、o while(p!=NULL) si+=p; p=p-lc; if(i0) p=s-i; printf(%c ,p-data); if(p-lc=NULL) p-lt=1; p-lc=pr; if(pr-rc=NULL) pr-rt=1; pr-rc=p; pr=p; p=p-rc; while(i0|p!=NULL); pr-rc=t; pr-rt=1; t-rc=pr; return(t);v算法l按中序线索化二叉树ABCDE输出: B C A E D A B D C Et 0 11111110000v算法l遍历中序线索二叉树在中序中序线索二叉树中找结点后继后继的方法:(1)若rt=1,
44、 则rc域直接指向其后继(2)若rt=0, 则结点的后继应是其 右子树的左链尾(lt=1)的结点在中序中序线索二叉树中找结点前驱前驱的方法:(1)若lt=1, 则lc域直接指向其前驱(2)若lt=0, 则结点的前驱应是其 左子树的右链尾(rt=1)的结点在遍历中序线索二叉树时,只要先找到序列中的第一个结点,然后依次找结点后继,直至其后继为空时为止。6.5 二叉树的应用哈夫曼树(Huffman)带权权路径长度最短的树v定义l路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的l路径长度:路径上的分支数l树的路径长度:从树根到每一个结点的路径长度之和l树的带权路径长度:树中所有带权结点的路
45、径长度之和结点到根的路径长度权值其中:记作:kknkkklwlwwpl1lHuffman树设有n个权值w1,w2,wn,构造一棵有n个叶子叶子结点的二叉树,每个叶子的权值为wi,则wpl最小的二叉树叫例 有4个结点,权值分别为7,5,2,4,构造有4个叶子结点的二叉树abcd7524WPL=7*2+5*2+2*2+4*2=36dcab2475WPL=7*3+5*3+2*1+4*2=46abcd7524WPL=7*1+5*2+2*3+4*3=35nkKKLWWPL1v构造Huffman树的方法Huffman算法l构造Huffman树步骤u根据给定的n个权值w1,w2,wn,构造n棵只有根结点的二叉树,令其权值为wju在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年打折促销试题分析及答案
- 工作指南有机合成研究员的每日任务安排
- 新手入门模切工作的日常规划
- 草酸酯建设项目节能评估报告
- 消防工程案例分析指南
- 股票投资初级知识学习与策略制定
- 2025中国智能交通系统建设进度及数据互联与投资回收模式研究报告
- 2025中国智慧医疗发展分析及数据安全与服务体系研究报告
- 2025中国智慧农业发展趋势及投资价值评估报告
- 2025中国旅游休闲行业市场现状分析及发展前景与投资价值研究报告
- 排水管网运维养护服务方案投标文件(技术标)
- 医院客服培训课件
- 2025-2030中国生物基氨纶市场销售规模与未来前景营销格局报告
- Artemis:2025年稳定币⽀付:全球浪潮与新⾦融基石报告
- 铁路冬季安全知识培训课件
- 湿地保护工程项目建设标准
- 2025江苏苏州市张家港市基层公共服务岗位招聘14人(第一批)备考题库及答案解析
- 设备管理基础知识培训课件
- 新零售电商模式课件
- 新能源汽车研发知识培训课件
- 电动葫芦安全操作规程详解
评论
0/150
提交评论