- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Int Depth(CSTree T) { If (T==NULL) return 0; Else{ D1 = Depth(T-firstchild); D2 = Depth(T-nextsibling); Return Max{d1+1,d2} int TreeDepth( CTree T ) { // T 是树的孩子链表存储结构, // 返回该树的深度 if ( T.n == 0) return 0; else return Depth( T, T.r ); } // TreeDepth 一、求树的深度的算法: int Depth( CTree T, int root ){ max = 0; p = T.nodes[root].firstchild; while ( p ) { h = Depth( T, p-child ); if ( h max ) max = h; p = p-nextchild; }//while return max+1; } 二、输出树中所有从根到叶子的路径的算法: A B C D E F G H I J K 例如:对左图所示的树,其输出结果应为: A B E A B F A C A D G H I A D G H J A D G H K void AllPath( BiTree T, Stack S ) { if (T) { Push( S, T-data ); if (!T-Lchild !T-Rchild ) PrintStack(S); else { AllPath( T-Lchild, S ); AllPath( T-Rchild, S ); } Pop(S); } // if(T) } // AllPath // 输出二叉树上从根到所有叶子结点的路径 void OutPath( Bitree T, Stack S ) { while ( !T ) { Push(S, T-data ); if ( !T-firstchild ) Printstack(S); else OutPath( T-firstchild, S ); Pop(S); T = T-nextsibling; } // while } // OutPath // 输出森林中所有从根到叶的路径 三、建树的存储结构的算法: 和二叉树类似,不同的定义相应有不同的算法。 假设以二元组(F,C)的形式自上而下、自左而右依次输入树的各边,建立树的孩子-兄弟链表。 A B C D E F G 例如: 对下列所示树的输入序列应为: (‘#’, ‘A’) (‘A’, ‘B’) (‘A’, ‘C’) (‘A’, ‘D’) (‘C’, ‘E’) (‘C’, ‘F’) (‘E’, ‘G’) A B C D (‘#’, ‘A’) (‘A’, ‘B’) (‘A’, ‘C’) (‘A’, ‘D’) (‘C’, ‘E’) 可见,算法中需要一个队列保存已建好的结点的指针 void CreatTree( CSTree T ) { T = NULL; for( scanf(fa, ch); ch!=? ?; scanf(fa, ch);) { p = GetTreeNode(ch); // 创建结点 EnQueue(Q, p); // 指针入队列 if (fa == ? ?) T = p; // 所建为根结点 else { } // 非根结点的情况 } // for } // CreateTree … … GetHead(Q,s); // 取队列头元素(指针值) while (s-data != fa ) { // 查询双亲结点 DeQueue(Q,s); GetHead(Q,s); } if (!(s-firstchild)) { s-firstchild = p; r = p; } // 链接第一个孩子结点 e
文档评论(0)