<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.kram.nz/index.php?action=history&amp;feed=atom&amp;title=SE250%3Alab-6%3Adols008</id>
	<title>SE250:lab-6:dols008 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.kram.nz/index.php?action=history&amp;feed=atom&amp;title=SE250%3Alab-6%3Adols008"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-6:dols008&amp;action=history"/>
	<updated>2026-04-20T22:52:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.kram.nz/index.php?title=SE250:lab-6:dols008&amp;diff=7080&amp;oldid=prev</id>
		<title>Mark: 7 revision(s)</title>
		<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-6:dols008&amp;diff=7080&amp;oldid=prev"/>
		<updated>2008-11-03T05:20:04Z</updated>

		<summary type="html">&lt;p&gt;7 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;===Task 1===&lt;br /&gt;
To determine the relationship between tree size and height, I decided to loop through a number of different tree sizes. For each tree size I would generate a random binary tree and record it&amp;#039;s height. Here is some sample data:&lt;br /&gt;
&amp;lt;pre&amp;gt;Size	Height&lt;br /&gt;
0	0&lt;br /&gt;
100	13&lt;br /&gt;
200	17&lt;br /&gt;
300	18&lt;br /&gt;
400	16&lt;br /&gt;
500	19&lt;br /&gt;
600	24&lt;br /&gt;
700	20&lt;br /&gt;
800	20&lt;br /&gt;
900	22&lt;br /&gt;
1000	24&amp;lt;/pre&amp;gt;&lt;br /&gt;
To make my data more accurate, I decided to generate a number of trees of any particular size and average the heights. Here are the results after averaging 10 trees per size:&lt;br /&gt;
&amp;lt;pre&amp;gt;Size	Height&lt;br /&gt;
0	0.000000&lt;br /&gt;
100	13.400000&lt;br /&gt;
200	16.000000&lt;br /&gt;
300	17.800000&lt;br /&gt;
400	18.400000&lt;br /&gt;
500	19.700000&lt;br /&gt;
600	20.100000&lt;br /&gt;
700	20.800000&lt;br /&gt;
800	20.700000&lt;br /&gt;
900	21.600000&lt;br /&gt;
1000	22.100000&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I was disappointed to find that there is no given method for freeing binary trees.&lt;br /&gt;
&lt;br /&gt;
===Task 2===&lt;br /&gt;
Implementing the minimum and maximum functions was straight forward, but testing them was a little tricky. I opted to do it by generating a few random trees, printing them out using show_tree and visually checking my minimum and maximum were correct. The output of show_tree was less than intuitive, it took me a while to figure out the tree is actually sideways. I also found that the root of my tree always had a key of 0, so I seeded rand() to get some more interesting data.&lt;br /&gt;
&lt;br /&gt;
Here is my code for minimum and maximum:&lt;br /&gt;
&amp;lt;pre&amp;gt;Node* minimum( Node* node ) {&lt;br /&gt;
  if (node != empty &amp;amp;&amp;amp; node-&amp;gt;left != empty)&lt;br /&gt;
    return minimum(node-&amp;gt;left);&lt;br /&gt;
  return node;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Node* maximum( Node* node ) {&lt;br /&gt;
  if (node != empty &amp;amp;&amp;amp; node-&amp;gt;right != empty)&lt;br /&gt;
    return maximum(node-&amp;gt;right);&lt;br /&gt;
  return node;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Task 3===&lt;br /&gt;
Lookup wasn&amp;#039;t hard either, but again it was a pain to test. I had to construct the tree by hand this time so that I knew which numbers were in it (though it occurs to me now I could have used the same seed each time). Here&amp;#039;s the code:&lt;br /&gt;
&amp;lt;pre&amp;gt;Node* lookup( int key, Node* node ) {&lt;br /&gt;
  if (node == empty || key == node-&amp;gt;key)&lt;br /&gt;
    return node;&lt;br /&gt;
  if (key &amp;gt; node-&amp;gt;key)&lt;br /&gt;
    return lookup(key, node-&amp;gt;right);&lt;br /&gt;
  else&lt;br /&gt;
    return lookup(key, node-&amp;gt;left);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Task 4/5===&lt;br /&gt;
Preorder took a fair bit of thought. It didn&amp;#039;t seem hard at first, but it took a couple of broken versions which got stuck down leaves before I got it right. Once I had a working version I tidied it up a bit and removed an extra variable.&lt;br /&gt;
&amp;lt;pre&amp;gt;Node* next_pre( Node* node ) {&lt;br /&gt;
  if (node == empty)&lt;br /&gt;
    return empty;&lt;br /&gt;
  if (node-&amp;gt;left != empty)&lt;br /&gt;
    return node-&amp;gt;left;&lt;br /&gt;
  if (node-&amp;gt;right != empty)&lt;br /&gt;
    return node-&amp;gt;right;&lt;br /&gt;
  while (node-&amp;gt;parent != empty)&lt;br /&gt;
  {&lt;br /&gt;
    if (node-&amp;gt;parent-&amp;gt;right != empty &amp;amp;&amp;amp; node-&amp;gt;parent-&amp;gt;right != node)&lt;br /&gt;
      return node-&amp;gt;parent-&amp;gt;right;&lt;br /&gt;
    node = node-&amp;gt;parent;&lt;br /&gt;
  }&lt;br /&gt;
  return empty;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I skipped ahead to next_in, because it seemed more interesting. This one took a couple of tries too. There&amp;#039;s less in common between the functions than I expected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Node* next_in( Node* node ) {&lt;br /&gt;
  if (node == empty)&lt;br /&gt;
    return empty;&lt;br /&gt;
  if (node-&amp;gt;right != empty)&lt;br /&gt;
  {&lt;br /&gt;
    node = node-&amp;gt;right;&lt;br /&gt;
    while (node-&amp;gt;left != empty)&lt;br /&gt;
      node = node-&amp;gt;left;&lt;br /&gt;
    return node;&lt;br /&gt;
  }&lt;br /&gt;
  while (node-&amp;gt;parent &amp;amp;&amp;amp; node-&amp;gt;parent-&amp;gt;right == node)&lt;br /&gt;
    node = node-&amp;gt;parent;&lt;br /&gt;
  return node-&amp;gt;parent;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s not getting much easier. next_post took some figuring out too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Node* next_post( Node* node ) {&lt;br /&gt;
  if (node == empty || node-&amp;gt;parent == empty)&lt;br /&gt;
    return empty;&lt;br /&gt;
  if (node-&amp;gt;parent-&amp;gt;right != empty &amp;amp;&amp;amp; node-&amp;gt;parent-&amp;gt;right != node)&lt;br /&gt;
  {&lt;br /&gt;
    node = node-&amp;gt;parent-&amp;gt;right;&lt;br /&gt;
    while (node-&amp;gt;left != empty)&lt;br /&gt;
      node = node-&amp;gt;left;&lt;br /&gt;
    while (node-&amp;gt;right != empty)&lt;br /&gt;
      node = node-&amp;gt;right;&lt;br /&gt;
    return node;&lt;br /&gt;
  }&lt;br /&gt;
  return node-&amp;gt;parent;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I&amp;#039;m well over time now. I might come back to this later, it&amp;#039;s good practice.&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>