- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
教材与参考资料.ppt
* 对称序周游 1,若当前二叉树不为空时,则沿其左子树尽量前进,在前进过程中,把所经过的二叉树逐个压入栈中,直到左子树为空。 2,弹出栈顶元素为当前二叉树,并访问该二叉树的根; 3,如果当前二叉树有右子树,再进入它的右子树(作为当前二叉树),从1开始执行上述过程; 4,如果当前二叉树没有右子树,但是栈不空,转2。 重复上面的处理,直到当前二叉树没有右子树并且栈也为空时,周游结束。 * 对称序周游的非递归算法 void nInOrder(BinTree t) { Stack s= createEmptyStack();/*栈元素的类型是BinTree */ BinTree c= t; if (c = = NULL) return; do { while (c != NULL) { push(s, c); c = leftChild(c); } c = top(s); pop(s); visit(root(c) ); c = rightChild(c); } while (c != NULL || !isEmptyStack(s)); } 算法的时间代价 假设栈的主要操作只要常量时间,算法中每个二叉树恰好进栈、出栈各一次,所以它的时间代价还是O(n),其中n为二叉树中子二叉树(也是结点)的个数。 外表看它是一个双重循环,但时间代价还是线性的。 * * 后根次序周游 首先是由该二叉树找到其左子树,周游其左子树,周游完返回到这个二叉树的根; 然后是由该二叉树找到其右子树,周游其右子树,周游完再次返回到这个二叉树的根, 最后才能访问该二叉树的根结点。 为此必须在算法中增加对二叉树出栈的判断: 如果是从栈顶二叉树的左子树回来,就直接进入右子树周游; 如果是从栈顶二叉树的右子树回来,就执行出栈,访问该二叉树的根结点。 * 后根次序周游算法 void nPostOrder3( BinTree t ) { Stack s = createEmptyStack ( ); /*栈中元素的类型是BinTree*/ BinTree p = t; while ( p != NULL || !isEmptyStack (s) ) { while (p != NULL) { push ( s, p ); p = leftChild (p)? leftChild (p): rightChild(p); } /* 循环到当前需要处理的结点*/ p = top (s); pop (s); visit(root(p)); /* 栈顶二叉树的根是应访问结点*/ if ( !isEmptyStack (s) leftChild (top (s)) == p ) p = rightChild(top (s)) ; /* 栈不空,且为从左子树退回*/ else p = NULL; /*从右子树回来,退到上一层处理 */ } } 注意:这个算法是教材中 nPostOrder2算法的精化描述 (更清晰、可读,又节省了变量pr) 算法的代价 假设栈的主要操作只要常量时间,算法中每个二叉树恰好进栈、出栈各一次,所以它的时间代价还是O(n),其中n为二叉树中子二叉树(也是结点)的个数。 外表看它是一个双重循环,但时间代价还是线性的。 各种深度周游算法的空间代价主要是栈。最坏情况是O(n) * * 广度优先周游 根据广度优先周游的思想不难想到,可以利用一个队列实现其算法: 首先把二叉树送入队列;其后,每当从队首取出一个二叉树访问根之后,马上把它的子二叉树按从左到右的次序送入队列尾端;重复此过程直到队列为空。 * 广度优先周游二叉树 void levelOrder(BinTree t) { BinTree c, cc; Queue q= createEmptyQueue(); /* 队列元素为BinTree类型*/ if (t==NULL) return; /*空二叉树返回*/ c = t; enQueue(q,c); /*将二叉树送入队列*/ while (!isEmptyQueue(q)) { c = frontQueue(q); deQueue(q); vis
您可能关注的文档
最近下载
- 深静脉血栓诊断和治疗指南(2024版).pptx VIP
- 体育概论 第三版 杨文轩 陈琦 全国普通高等学校体育专业类基础课程教材-第二章 体育功能.ppt VIP
- 焊接工艺卡(焊接工艺指导书).doc VIP
- 人教版PEP四年级上册英语第二单元测试卷(含答案详解)2套.docx VIP
- 第15课《红红火火中国年》第2课时 越过越好中国年 教案设计 2025道德与法治二年级上册.docx
- 市政道路给水工程专项施工方案.doc VIP
- 土力学与基础工程.ppt VIP
- 2025年拍卖从业人员资格练习题测练习题.docx VIP
- 六年级数学求比值和化简比对比练习.doc VIP
- 柴油加氢改质装置培训.pptx VIP
文档评论(0)