天天看點

二叉樹的非遞歸周遊

<code>/*</code>

<code>先序周遊,首先通路根結點然後周遊左子樹,最後周遊右子樹。在周遊左、右子樹時,仍然先通路</code>

<code>根結點,然後周遊左子樹,最後周遊右子樹,如果二叉樹為空則傳回。</code>

<code>*/</code>

<code>//處理過如下</code>

<code>//對于任一結點p:     </code>

<code>//    1)将結點p入棧,通路節點p,節點p出棧;</code>

<code>//    2)判斷結點p的右孩子是否為空,其次判斷p的左孩子是否為空,這樣先壓右子樹入棧,左子</code>

<code>//          樹後壓就可以先通路;</code>

<code>void</code> <code>PrevOrder_NonR()</code>

<code>    </code><code>{</code>

<code>        </code><code>stack&lt;BinaryTreeNode&lt;T&gt;*&gt; s;</code>

<code>        </code><code>if</code> <code>(_root)</code>

<code>        </code><code>{</code>

<code>            </code><code>s.push(_root);    </code><code>//将樹入棧</code>

<code>        </code><code>}</code>

<code>        </code><code>while</code> <code>(!s.empty())  </code><code>//棧不為空,根節點先出棧</code>

<code>            </code><code>BinaryTreeNode&lt;T&gt;* top = s.top();</code>

<code>            </code><code>s.pop();</code>

<code>            </code><code>cout &lt;&lt; top-&gt;_data &lt;&lt; </code><code>" "</code><code>;</code>

<code>            </code><code>if</code> <code>(top-&gt;_right)            </code><code>//壓入右子樹</code>

<code>            </code><code>{</code>

<code>                </code><code>s.push(top-&gt;_right);</code>

<code>            </code><code>}</code>

<code>            </code><code>if</code> <code>(top-&gt;_left)            </code><code>//壓入左子樹</code>

<code>                </code><code>s.push(top-&gt;_left);</code>

<code>        </code><code>cout &lt;&lt; endl;</code>

<code>    </code><code>}</code>

<code>中序周遊,中序周遊首先周遊左子樹,然後通路根結點,最後周遊右子樹。在周遊左、右子樹時,</code>

<code>仍然先周遊左子樹,再通路根結點,最後周遊右子樹。即:若二叉樹為空則結束傳回</code>

<code>否則:</code>

<code>(1)中序周遊左子樹。</code>

<code>(2)通路根結點。</code>

<code>(3)中序周遊右子樹。</code>

<code>// 處理過程如下:</code>

<code>// 對于任一結點cur, </code>

<code>//  1)若其左孩子不為空,則将cur入棧并将cur的左孩子置為目前的cur,然後對目前結點cur再進行相</code>

<code>//    同的處理;</code>

<code>//  2)若其左孩子為空,則取棧頂元素并進行出棧操作,通路該棧頂結點,然後将目前的cur置為棧頂</code>

<code>//    結點的右孩子;</code>

<code>//  3)直到cur為NULL并且棧為空則周遊結束</code>

<code>void</code> <code>InOrder_NonR()</code>

<code>        </code><code>BinaryTreeNode&lt;T&gt;* cur = _root;</code>

<code>        </code><code>while</code> <code>(cur || !s.empty())</code>

<code>            </code><code>while</code> <code>(cur)</code>

<code>                </code><code>s.push(cur);</code>

<code>                </code><code>cur = cur-&gt;_left;</code>

<code>            </code><code>if</code> <code>(!s.empty())</code>

<code>                </code><code>BinaryTreeNode&lt;T&gt;* top = s.top();</code>

<code>                </code><code>cout &lt;&lt; top-&gt;_data &lt;&lt; </code><code>" "</code><code>;</code>

<code>                </code><code>s.pop();</code>

<code>                </code><code>cur = top-&gt;_right;</code>

<code>後序周遊,</code>

<code>後序周遊首先周遊左子樹,然後周遊右子樹,最後通路根結點,在周遊左、右子樹時,仍然先周遊左子</code>

<code>樹,然後周遊右子樹,最後周遊根結點。即:若二叉樹為空則結束傳回</code>

<code>// 要保證根結點在左孩子和右孩子通路之後才能通路,是以對于任一結點P,先将其入棧。如果P不存在</code>

<code>// 左孩子和右孩子,則可以直接通路它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被</code>

<code>// 通路過了,則同樣可以直接通路該結點。若非上述兩種情況,則将P的右孩子和左孩子依次入棧,這</code>

<code>// 樣就保證了每次取棧頂元素的時候,左孩子在右孩子前面被通路,左孩子和右孩子都在根結點前面被</code>

<code>// 通路。</code>

<code>void</code> <code>PostOrder_NonR()</code>

<code>        </code><code>BinaryTreeNode&lt;T&gt;* pre  = NULL;</code>

<code>            </code><code>//根節點要想被通路則該節點沒有右子樹或者沒有孩子節點</code>

<code>            </code><code>if</code> <code>(top-&gt;_right == NULL || top-&gt;_right == pre)</code>

<code>                </code><code>pre = top;</code>

<code>            </code><code>else</code>

二叉樹層次周遊即按照層次通路,通常用隊列來做。通路根,通路子女,再通路子女的子女(越往後的層次越低)(兩個子女的級别相同)

<code>void</code> <code>LevelOrder()</code>

<code>        </code><code>queue&lt;BinaryTreeNode&lt;T&gt;*&gt; q;</code>

<code>            </code><code>q.push(_toot);</code>

<code>        </code><code>while</code> <code>(!q.empty())    </code>

<code>            </code><code>BinaryTreeNode&lt;T&gt;* front = q.front();</code>

<code>            </code><code>q.pop();</code>

<code>            </code><code>cout &lt;&lt; front-&gt;_data &lt;&lt; </code><code>" "</code><code>;</code>

<code>            </code><code>if</code> <code>(front-&gt;_left)</code>

<code>                </code><code>q.push(front-&gt;_left);</code>

<code>            </code> 

<code>            </code><code>if</code> <code>(front-&gt;_right)</code>

<code>                </code><code>q.push(front-&gt;_right);</code>

本文轉自 七十七快 51CTO部落格,原文連結:http://blog.51cto.com/10324228/1755467

繼續閱讀