《数据结构用C语言描述》第六章.j.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《《数据结构用C语言描述》第六章.j.ppt》由会员分享,可在线阅读,更多相关《《数据结构用C语言描述》第六章.j.ppt(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章 树和二叉树树和二叉树树的概念和基本术语二叉树 二叉树遍历二叉树的计数树与森林哈夫曼树 树的概念和基本术语树的概念和基本术语树的定义树的定义 树是由树是由 n(n 0)个结点的有限集合。如个结点的有限集合。如果果 n=0,称为空树;如果,称为空树;如果 n 0,则,则 有且仅有一个特定的称之为根有且仅有一个特定的称之为根(Root)的的结点,它只有直接后继,但没有直接前驱;结点,它只有直接后继,但没有直接前驱;当当n 1,除根以外的其它结点划分为除根以外的其它结点划分为 m(m 0)个互不相交的有限集个互不相交的有限集 T1,T2,Tm,其中每个集合本身又是一棵树,并且称其中每个集
2、合本身又是一棵树,并且称为根的子树为根的子树(SubTree)。ACGBDEFKLHMIJ例如例如A只有根结点的树只有根结点的树有有13个结点的树个结点的树其中:其中:A是根;其余结点分成三个互不相交的子集,是根;其余结点分成三个互不相交的子集,T1=B,E,F,K,L;T2=C,G;T3=D,H,I,J,M,T1,T2,T3都是根都是根A的子树,且本身也是一棵树的子树,且本身也是一棵树树的基本术语树的基本术语1层2层4层3层height=4ACGBDEFKLHMIJ结点结点结点的度结点的度叶结点叶结点分支结点分支结点子女子女双亲双亲兄弟兄弟祖先祖先子孙子孙结点层次结点层次树的深树的深度度树的
3、度树的度森林森林二叉树二叉树(Binary Tree)定义定义五种形态五种形态一棵二叉树是结点的一个有限集合,一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互不上两棵分别称为左子树和右子树的、互不相交的二叉树组成。相交的二叉树组成。LLRR特点特点每个结点至多只有两棵子树(二叉树中每个结点至多只有两棵子树(二叉树中不存在度大于不存在度大于2的结点)的结点)性质性质1 在二叉树的第在二叉树的第 i 层上至多有层上至多有 2i 1个结点。个结点。(i 1)证明用归纳法证明用归纳法证明:当证明:当i=1时,只有
4、根结点,时,只有根结点,2 i-1=2 0=1。假设对所有假设对所有j,ij 1,命题成立,即第,命题成立,即第j层层上至多有上至多有2 j-1 个结点。个结点。由归纳假设第由归纳假设第i-1 层上至多有层上至多有 2i 2个结点。个结点。由于二叉树的每个结点的度至多为由于二叉树的每个结点的度至多为2,故在,故在第第i层上的最大结点数为第层上的最大结点数为第i-1层上的最大结层上的最大结点数的点数的2倍,即倍,即2*2i 2=2 i-1。性质性质性质性质2 深度为深度为 k 的二叉树至多有的二叉树至多有 2 k-1个结点个结点(k 1)。证明:由性质证明:由性质1可见,深度为可见,深度为k的二
5、叉树的的二叉树的最大结点数为最大结点数为 20+21+2 k-1=2 k-1性质性质3 对任何一棵二叉树对任何一棵二叉树T,如果其叶如果其叶结点数为结点数为 n0,度为度为2的结点数为的结点数为 n2,则则n0n21.证明:若度为证明:若度为1的结点有的结点有 n1 个,总结点个个,总结点个数为数为 n,总边数为,总边数为 e,则根据二叉树的定,则根据二叉树的定义,义,n=n0+n1+n2 e=2n2+n1=n-1因此,有因此,有 2n2+n1=n0+n1+n2-1 n2=n0-1 n0=n2+1 定义定义1 满二叉树满二叉树(Full Binary Tree)一棵深度为一棵深度为k且有且有2
6、 k-1个结点的二叉树称为个结点的二叉树称为满二叉树。满二叉树。两种特殊形态的二叉树两种特殊形态的二叉树621754389 10 1113 14 1512满二叉树满二叉树215436 7216543非完全二叉树非完全二叉树定义定义2 完全二叉树完全二叉树(Complete Binary Tree)若设二叉树的高度为若设二叉树的高度为h,则共有,则共有h层。除第层。除第 h 层外,其它各层层外,其它各层(0 h-1)的结点数都达到的结点数都达到最大个数,第最大个数,第 h 层层从右向左从右向左连续缺若干结点,连续缺若干结点,这就是完全二叉树。这就是完全二叉树。621754389 10 11 12
7、完全二叉树完全二叉树性质性质4 具有具有 n(n 0)个结点的完全二叉树个结点的完全二叉树的深度为的深度为 log2(n)1 证明:证明:设完全二叉树的深度为设完全二叉树的深度为 h,则根据性,则根据性质质2和完全二叉树的定义有和完全二叉树的定义有2h1-1 n 2h-1或或 2h1 n 2h取对数取对数 h1 0,则则 i 的双亲为的双亲为 i/2 n 若若2*i =n,则则 i 的左子女为的左子女为 2*i,若若2*i+1-lchild);printf(“t%cn”,t-data);InOrder(t-rchild);中序遍历二叉树的递归算法中序遍历二叉树的递归算法前序遍历二叉树算法的定义
8、:前序遍历二叉树算法的定义:若二叉树为空,则空操作;若二叉树为空,则空操作;否则否则访问根结点访问根结点(D);前序遍历左子树前序遍历左子树(L);前序遍历右子树前序遍历右子树(R)。遍历结果遍历结果-+a*b-c d/e f前序遍历前序遍历(Preorder Traversal)-/+*abcdef前序遍历二叉树的递归算法前序遍历二叉树的递归算法void PreOrder(bitree *t)if(t!=NULL)printf(“t%cn”,t-data);PreOrder(t-lchild);PreOrder(t-rchild);后序遍历二叉树算法的定义:后序遍历二叉树算法的定义:若二叉树
9、为空,则空操作;若二叉树为空,则空操作;否则否则后序遍历左子树后序遍历左子树(L);后序遍历右子树后序遍历右子树(R);访问根结点访问根结点(D)。遍历结果遍历结果 a b c d-*+e f/-后序遍历后序遍历(Postorder Traversal)-/+*abcdef后序遍历二叉树的递归算法:后序遍历二叉树的递归算法:void PostOrder(bitree*t)if(t!=NULL)PostOrder(t-lchild);PostOrder(t-rchild);printf(“t%cn”,t-data);int Count(bitree*T)if(T=NULL)return 0;el
10、se return 1+Count(T-lchild)+Count(T-rchild);1.计算二叉树结点个数计算二叉树结点个数(递归算法递归算法)int Leaf_Count(Bitree*T)/求二叉树中叶子结点的数目求二叉树中叶子结点的数目 if(!T)return 0;/空树没有叶子空树没有叶子 else if(!T-lchild&!T-rchild)return 1;/叶子结点叶子结点else return Leaf_Count(T.lchild)+Leaf_Count(T.rchild);/左子树的叶子数加上右子树的叶子数左子树的叶子数加上右子树的叶子数2.求二叉树中叶子结点的个数
11、求二叉树中叶子结点的个数int Height(bitree*T)int m,n;if(T=NULL)return -1;else m=Height(T-lchild);n=Height(T-rchild );return(m n)?m+1:n+1;3.求二叉树高度求二叉树高度(递归算法递归算法)4.复制二叉树复制二叉树(递归算法递归算法)int Copy(bitree*T)if(T=NULL)return-1;bitree*temp;Temp-data=T-data;Temp-lchild=Copy(T-lchild);Temp-rchild=Copy(T-rchild);return tem
12、p;5.判断二叉树等价判断二叉树等价(递归算法递归算法)int Equal(bitree*a,bitree*b)if(a=NULL&b=NULL)return 1;if(a!=NULL&b!=NULL&a-data=b-data&equal(a-lchild,b-lchild)&equal(a-rchild,b-rchild)return 1;else return 0;/a和和b的子树不等同的子树不等同中序遍历二叉树中序遍历二叉树(非递归算法非递归算法)用栈实现用栈实现baabcdeadaaa b入栈入栈b退栈退栈访问访问d入栈入栈d退栈退栈访问访问e 退栈退栈 访问访问ecc栈空栈空 a退
13、栈退栈访问访问c e 入栈入栈c 退栈退栈 访问访问 void InOrder(bitree*T)stack *S;SETNULL(S);/递归工作栈递归工作栈 bitree*p=T;/初始化初始化 while(p!=NULL|!Empty(S)if(p!=NULL)Push(S,p);p=p-lchild;if(!Empty(S)/栈非空栈非空 Pop(S,p);/退栈退栈 printf(“%cn”,p-data);/访问根访问根 p=p-rchild;/if /while return ok;abcde前序遍历二叉树前序遍历二叉树(非递归算法非递归算法)用栈实现用栈实现acabcdedcc
14、访问访问a进栈进栈c左进左进b访问访问b进栈进栈d左进左进空空退栈退栈d访问访问d左进左进空空退栈退栈c访问访问c左进左进e访问访问e左进左进空空退栈退栈 结束结束void PreOrder(bitree *T)stack*S;SETNULL(S);/递归工作栈递归工作栈 bitree*p=T;Push(S,NULL);while(p!=NULL)printf(“%cn”,p-data);if(p-rchild!=NULL)Push(S,p-rchild);if (p-lchild!=NULL)p=p-lchild;/进左子树进左子树 else Pop(S,p);abcdev后序遍历二叉树后序
15、遍历二叉树(非递归算法非递归算法)用栈实现用栈实现后序遍历时使用的栈的结点定义后序遍历时使用的栈的结点定义typedef struct bitree*ptr;/结点指针结点指针 enum tag L,R;/该结点退栈标记该结点退栈标记 StackNode;根结点的根结点的 tag=L,表示从左子树退出,表示从左子树退出,访问右子树。访问右子树。tag=R,表示从右子树退出表示从右子树退出,访问根。访问根。ptr tagL,R vvoid PostOrder(BinTree T)stack S;InitStack(&S);StackNode w;bitree*p=T;do while(p!=NU
16、LL)/向左子树走向左子树走 w.ptr=p;w.tag=L;Push(&S,w);p=p-lchild;int continue=1;/继续循环标记继续循环标记 while(continue&!StackEmpty(&S)Pop(&S,w);p=w.ptr;switch(w.tag)/判断栈顶判断栈顶tag标记标记 case L:w.tag=R;Push(&S,w);continue=0;p=p-rchild;break;case R:cout-data endl;while(p!=NULL|!StackEmpty(&S);cout-lchild;p-lchild=p-rchild;p-rc
17、hild=temp;unknown(p-lchild);unknown(p-rchild);void unknown(bitree*T)bitree*p=T,*temp;while(p!=NULL)temp=p-lchild;p-lchild=p-rchild;p-rchild=temp;unknown(p-lchild);p=p-rchild;不用栈消去递归算法中的第二个递归语句不用栈消去递归算法中的第二个递归语句 使用栈消去递归算法中的两个递归语句使用栈消去递归算法中的两个递归语句void unknown(bitree*T)bitree*p,*temp;stack *S;SETNULL(S
18、);if(T!=NULL)push(S,T);while(!Empty(S)Pop(S,p);/栈中退出一个结点栈中退出一个结点 temp=p-lchild;/交换子女交换子女 p-lchild=p-rchild;p-rchild=temp;if(p-rchild!=NULL)push(S,p-rchild);if(p-lchild!=NULL)push(S,p-lchild);ltag=0,lchild为为左子女指针左子女指针ltag=1,lchild为为前驱线索前驱线索rtag=0,rchild为为右子女指针右子女指针rtag=1,rchild为为后继指针后继指针lchildlchildr
19、childrchilddatadataltagrtagv线索二叉树线索二叉树(Threaded Binary Tree)结点结构结点结构 下面给出线索链表的形式说明下面给出线索链表的形式说明:typedef int datatype;typedef struct node int ltag,rtag;datatype data;struct node *lchild,*rchild;bithptr;bithptr *pre;通过中序遍历建立中序线索化二叉树通过中序遍历建立中序线索化二叉树bithptr *pre=null;INTHREAD(bithptr*p)if(p!=NULL)INTHRE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构用C语言描述 数据结构 语言 描述 第六
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内