﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-woaidongmao-随笔分类-数据结构 &amp; 算法</title><link>http://www.cppblog.com/woaidongmao/category/12036.html</link><description>文章均收录自他人博客，但不喜标题前加-[转贴]，因其丑陋，见谅！~</description><language>zh-cn</language><lastBuildDate>Sat, 10 Oct 2009 07:42:38 GMT</lastBuildDate><pubDate>Sat, 10 Oct 2009 07:42:38 GMT</pubDate><ttl>60</ttl><item><title>精典二叉树非递归遍历的算法</title><link>http://www.cppblog.com/woaidongmao/archive/2009/10/10/98245.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sat, 10 Oct 2009 07:00:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/10/10/98245.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/98245.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/10/10/98245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/98245.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/98245.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="word-break: break-all; line-height: 150%"><span style="line-height: 150%; font-family: 宋体; mso-bidi-font-size: 10.5pt">遍历二叉树的非递归算法<span lang="EN-US"><br></span>编写的方法：根据树中结点的遍历规律及顺序直接写出其非递归算法。<span lang="EN-US"><br></span>先序非递归算法<span lang="EN-US"><br></span>【思路】<span lang="EN-US"><br></span>假设：<span lang="EN-US">T</span>是要遍历树的根指针，若<span lang="EN-US">T != NULL<br></span>对于非递归算法，引入栈模拟递归工作栈，初始时栈为空。<span lang="EN-US"><br></span>问题：如何用栈来保存信息，使得在先序遍历过左子树后，能利用栈顶信息获取<span lang="EN-US">T</span>的右子树的根指针？<span lang="EN-US"><br></span>方法<span lang="EN-US">1</span>：访问<span lang="EN-US">T-&gt;data</span>后，将<span lang="EN-US">T</span>入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为<span lang="EN-US">T</span>，出栈，再先序遍历<span lang="EN-US">T</span>的右子树。<span lang="EN-US"><br></span>方法<span lang="EN-US">2</span>：访问<span lang="EN-US">T-&gt;data</span>后，将<span lang="EN-US">T-&gt;rchild</span>入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为<span lang="EN-US">T-&gt;rchild</span>，出栈，遍历以该指针为根的子树。<span lang="EN-US"><br></span>【算法<span lang="EN-US">1</span>】<span lang="EN-US"><br>void&nbsp;&nbsp;&nbsp; PreOrder(BiTree T, Status ( *Visit ) (ElemType e))<br><br>{&nbsp;&nbsp;&nbsp; // </span>基于方法一，流程图如右，当型循环<span lang="EN-US"><br>InitStack(S);<br>while ( T!=NULL || !StackEmpty(S)){<br>while ( T != NULL ){<br>Visit(T-&gt;data) ;<br>Push(S,T);<br>T = T-&gt;lchild;<br>}<br>if( !StackEmpty(S) ){<br>Pop(S,T);<br>T = T-&gt;rchild;<br>}<br>}<br>}<br></span>【算法<span lang="EN-US">2</span>】<span lang="EN-US"><br>void&nbsp;&nbsp;&nbsp; PreOrder(BiTree T, Status ( *Visit ) (ElemType e))<br><br>{&nbsp;&nbsp;&nbsp; // </span>基于方法二，流程图如右，当型循环<span lang="EN-US"><br>InitStack(S);<br>while ( T!=NULL || !StackEmpty(S) ){<br>while ( T != NULL ){<br>Visit(T-&gt;data);<br>Push(S, T-&gt;rchild);<br>T = T-&gt;lchild;<br>}<br>if ( !StackEmpty(S) ){<br>Pop(S,T);<br>}<br>}<br>}<br></span>进一步考虑：对于处理流程中的循环体的直到型、当型<span lang="EN-US">+</span>直到型的实现。<span lang="EN-US"><br></span>中序非递归算法<span lang="EN-US"><br></span>【思路】<span lang="EN-US"><br>T</span>是要遍历树的根指针，中序遍历要求在遍历完左子树后，访问根，再遍历右子树。<span lang="EN-US"><br></span>问题：如何用栈来保存信息，使得在中序遍历过左子树后，能利用栈顶信息获取<span lang="EN-US">T</span>指针？<span lang="EN-US"><br></span>方法：先将<span lang="EN-US">T</span>入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为<span lang="EN-US">T</span>，出栈，访问<span lang="EN-US">T-&gt;data</span>，再中序遍历<span lang="EN-US">T</span>的右子树。<span lang="EN-US"><br><br></span>【算法】<span lang="EN-US"><br>void&nbsp;&nbsp;&nbsp; InOrder(BiTree T, Status ( *Visit ) (ElemType e))<br>{&nbsp;&nbsp;&nbsp; // </span>流程图如右，当型循环<span lang="EN-US"><br>InitStack(S);<br>while ( T!=NULL || !StackEmpty(S) ){<br>while ( T != NULL ){<br>Push(S,T);<br>T = T-&gt;lchild;<br>}<br>if( !StackEmpty(S) ){<br>Pop(S, T);<br>Visit(T-&gt;data);<br>T = T-&gt;rchild;<br>}<br>}<br>}<br></span>进一步考虑：对于处理流程中的循环体的直到型、当型<span lang="EN-US">+</span>直到型的实现。<span lang="EN-US"><br></span>后序非递归算法<span lang="EN-US"><br></span>【思路】<span lang="EN-US"><br><br>T</span>是要遍历树的根指针，后序遍历要求在遍历完左右子树后，再访问根。需要判断根结点的左右子树是否均遍历过。<span lang="EN-US"><br></span>可采用标记法，结点入栈时，配一个标志<span lang="EN-US">tag</span>一同入栈<span lang="EN-US">(0</span>：遍历左子树前的现场保护，<span lang="EN-US">1</span>：遍历右子树前的现场保护<span lang="EN-US">)</span>。<span lang="EN-US"><br></span>首先将<span lang="EN-US">T</span>和<span lang="EN-US">tag(</span>为<span lang="EN-US">0)</span>入栈，遍历左子树；返回后，修改栈顶<span lang="EN-US">tag</span>为<span lang="EN-US">1</span>，遍历右子树；最后访问根结点。<span lang="EN-US"><br>typedef struct stackElement{<br>Bitree&nbsp;&nbsp;&nbsp; data;<br>char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag;<br>}stackElemType;<br></span>【算法】<span lang="EN-US"><br>void&nbsp;&nbsp;&nbsp; PostOrder(BiTree T, Status ( *Visit ) (ElemType e))<br>{&nbsp;&nbsp;&nbsp; // </span>流程图如右，当型循环<span lang="EN-US"><br>InitStack(S);<br>while ( T!=NULL || !StackEmpty(S) ){<br>while ( T != NULL ){<br>Push(S,T,0);<br>T = T-&gt;lchild;<br>}<br>while ( !StackEmpty(S) &amp;&amp; GetTopTag(S)==1){<br>Pop(S, T);<br>Visit(T-&gt;data);<br>}<br>if ( !StackEmpty(S) ){<br>SetTopTag(S, 1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>设置栈顶标记<span lang="EN-US"><br>T = GetTopPointer(S);&nbsp;&nbsp;&nbsp; // </span>取栈顶保存的指针<span lang="EN-US"><br>T = T-&gt;rchild;<br>}else break;<br>}<br>}</span></span><span lang="EN-US" style="line-height: 150%; font-family: 宋体; mso-bidi-font-family: 宋体; mso-bidi-font-size: 10.5pt"><?xml:namespace prefix = o /><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="line-height: 150%; font-family: 宋体; mso-bidi-font-family: arial; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/98245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-10-10 15:00 <a href="http://www.cppblog.com/woaidongmao/archive/2009/10/10/98245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>