<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>





<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document"><title>3-CNF</title>

<style>
<!--
	table td.head{ 
		background-color: #3a6ba5;
		border: 1px #000000 solid;
		font-family: Verdana;
		font-weight: bold;
		font-size: 14px;
		color: #f79c19;
		padding: 6px;
	}

	table td.body{ 
		border-bottom: 1px #6699CC dotted;
		text-align: left;
		font-family: Verdana, sans-serif, Arial;
		font-weight: normal;
		font-size: 14px;
		color: #3A6BA5;
		background-color: #fafafa;
		padding: 6px;
	}
	
-->
</style></head><body>



<p align="left"><font color="#ff0000" size="6"><span lang="en-ca"><b>&nbsp; 
 
</b></span><b>&nbsp;&nbsp;&nbsp; <span lang="en-ca">&nbsp;&nbsp; </span></b></font><span lang="en-ca"><font color="#ff0000" size="6"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reconstruction of preorder from inorder,postorder<br>
</b></font></span></p><span style="font-family: monospace;"><span style="font-weight: bold;">#include &lt;iostream&gt;<br>
#include &lt;map&gt;<br>
#include &lt;vector&gt;<br>
#include &lt;stdio.h&gt;<br>
<br>
<br>
using namespace std;<br>
<br>
typedef map&lt;int, int&gt; IntIntMap;<br>
typedef vector&lt;int&gt; IntVector;<br>
<br>
IntVector inVector;<br>
IntVector postVector;<br>
IntIntMap inMap;<br>
IntIntMap postMap;<br>
IntVector preVector;<br>
<br>
/*<br>
This is the source of data:<br>
http://en.wikipedia.org/wiki/Tree_traversal<br>
<br>
Depth-first<br>
<br>
&nbsp;&nbsp;&nbsp; Preorder traversal sequence: F, B, A, D, C, E, G, I, H (root, left, right)<br>
&nbsp;&nbsp;&nbsp; Inorder traversal sequence: A, B, C, D, E, F, G, H, I (left, root, right)<br>
&nbsp;&nbsp;&nbsp; Postorder traversal sequence: A, C, E, D, B, H, I, G, F (left, right, root)<br>
&nbsp;&nbsp;&nbsp; */<br>
<br>
void init()<br>
{<br>
&nbsp;&nbsp;&nbsp; size_t i;<br>
&nbsp;&nbsp;&nbsp; inVector.push_back('A');<br>
&nbsp;&nbsp;&nbsp; inVector.push_back('B');<br>
&nbsp;&nbsp;&nbsp; inVector.push_back('C');<br>
&nbsp;&nbsp;&nbsp; inVector.push_back('D');<br>
&nbsp;&nbsp;&nbsp; inVector.push_back('E');<br>
&nbsp;&nbsp;&nbsp; inVector.push_back('F');<br>
&nbsp;&nbsp;&nbsp; inVector.push_back('G');<br>
&nbsp;&nbsp;&nbsp; inVector.push_back('H');<br>
&nbsp;&nbsp;&nbsp; inVector.push_back('I');<br>
<br>
<br>
&nbsp;&nbsp;&nbsp; postVector.push_back('A');<br>
&nbsp;&nbsp;&nbsp; postVector.push_back('C');<br>
&nbsp;&nbsp;&nbsp; postVector.push_back('E');<br>
&nbsp;&nbsp;&nbsp; postVector.push_back('D');<br>
&nbsp;&nbsp;&nbsp; postVector.push_back('B');<br>
&nbsp;&nbsp;&nbsp; postVector.push_back('H');<br>
&nbsp;&nbsp;&nbsp; postVector.push_back('I');<br>
&nbsp;&nbsp;&nbsp; postVector.push_back('G');<br>
&nbsp;&nbsp;&nbsp; postVector.push_back('F');<br>
&nbsp;&nbsp;&nbsp; for (i = 0; i &lt;&nbsp; postVector.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; postMap.insert(make_pair(postVector[i], i));<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
// find the biggest index in post and return its value<br>
int findRoot(const IntVector&amp; inSubTree)<br>
{<br>
&nbsp;&nbsp;&nbsp; size_t index = 0;<br>
&nbsp;&nbsp;&nbsp; for (size_t i = 0; i &lt; inSubTree.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t pos = postMap[inSubTree[i]];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos &gt; index)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index = pos;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; return postVector[index];<br>
}<br>
<br>
<br>
void process(int root, IntVector inOrderVector)<br>
{<br>
&nbsp;&nbsp;&nbsp; if (inOrderVector.size() &gt; 0)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preVector.push_back(root);<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; int index;<br>
&nbsp;&nbsp;&nbsp; for (index = 0; index &lt; inOrderVector.size(); index ++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (inOrderVector[index] == root)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //split vector to left/right sub tree<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
IntVector left(inOrderVector.begin(), inOrderVector.begin()+index);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (left.size()&gt;0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int leftRoot = findRoot(left);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process(leftRoot, left);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
IntVector right(inOrderVector.begin() + index+1, inOrderVector.end());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (right.size()&gt;0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int rightRoot = findRoot(right);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process(rightRoot, right);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
int main()<br>
{<br>
&nbsp;&nbsp;&nbsp; init();<br>
&nbsp;&nbsp;&nbsp; int root = postVector[postVector.size()-1];<br>
&nbsp;&nbsp;&nbsp; process(root, inVector);<br>
&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; preVector.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char ch = preVector[i];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%c,", ch);<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; printf("\n");<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
}<br>
<br>
</span></span><br>
<pre></pre>

<pre></pre>

<pre></pre>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; <a href="PocketRuler.htm">                  







                       <img src="picture/back.gif" style="border: medium none ;" alt="back.gif (341 bytes)" height="35" width="32"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="index.htm">
<img src="picture/up.gif" style="border: medium none ;" alt="up.gif (335 bytes)" height="32" width="35"></a>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                         
<img src="picture/next.gif" style="border: medium none ;" alt="next.gif (337 bytes)" height="35" width="32">          


</p>

</body></html>