<?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%3Asshi080</id>
	<title>SE250:lab-6:sshi080 - 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%3Asshi080"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-6:sshi080&amp;action=history"/>
	<updated>2026-04-28T16:17:10Z</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:sshi080&amp;diff=7365&amp;oldid=prev</id>
		<title>Mark: 14 revision(s)</title>
		<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-6:sshi080&amp;diff=7365&amp;oldid=prev"/>
		<updated>2008-11-03T05:20:09Z</updated>

		<summary type="html">&lt;p&gt;14 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Lab 6 ==&lt;br /&gt;
&lt;br /&gt;
=== Task 1 ===&lt;br /&gt;
&lt;br /&gt;
Raw results:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Size	Height&lt;br /&gt;
3000	28&lt;br /&gt;
1500	25&lt;br /&gt;
600	21&lt;br /&gt;
300	18&lt;br /&gt;
150	13&lt;br /&gt;
100	12&lt;br /&gt;
50	10&lt;br /&gt;
10	5&lt;br /&gt;
0	0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Graph:&lt;br /&gt;
&lt;br /&gt;
Couldn&amp;#039;t upload to wiki, will host on intranet later.&lt;br /&gt;
&lt;br /&gt;
Its clear that the relationship between the tree size and height is logrithmetic.&lt;br /&gt;
&lt;br /&gt;
=== Task 2 ===&lt;br /&gt;
&lt;br /&gt;
Minimum &amp;amp; Maximum codes are pretty straight forward, but it looks like the random tree isn&amp;#039;t seeded hence the minimum was always 41 for me. Time to seed the random generator kthx.&lt;br /&gt;
&lt;br /&gt;
Minimum code&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Node* minimum( Node* node ) {&lt;br /&gt;
  Node* min = empty;&lt;br /&gt;
&lt;br /&gt;
  while(node != empty) {&lt;br /&gt;
	  if(node-&amp;gt;left == empty)&lt;br /&gt;
		  min = node;&lt;br /&gt;
		  break;&lt;br /&gt;
	node = node-&amp;gt;left;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return min;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum code&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Node* maximum( Node* node ) {&lt;br /&gt;
	Node* max = empty;&lt;br /&gt;
	&lt;br /&gt;
	while(node != empty) {&lt;br /&gt;
		if(node-&amp;gt;right == empty) {&lt;br /&gt;
			max = node;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		node = node-&amp;gt;right;&lt;br /&gt;
	}&lt;br /&gt;
	return max;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Task 3 ===&lt;br /&gt;
&lt;br /&gt;
Tested with the random tree, searching for nodes larger and smaller than parent. Also tested for non existing keys.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Node* lookup( int key, Node* node ) {&lt;br /&gt;
	Node* result = empty;&lt;br /&gt;
&lt;br /&gt;
	while(node != empty) {&lt;br /&gt;
		if(node-&amp;gt;key == key) {&lt;br /&gt;
			result = node;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		if(key &amp;lt; node-&amp;gt;key) {&lt;br /&gt;
			if(node-&amp;gt;left == empty)&lt;br /&gt;
				break;&lt;br /&gt;
			node = node-&amp;gt;left;&lt;br /&gt;
		} else if(key &amp;gt; node-&amp;gt;key) {&lt;br /&gt;
			if(node-&amp;gt;right == empty)&lt;br /&gt;
				break;&lt;br /&gt;
			node = node-&amp;gt;right;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Task 4 ===&lt;br /&gt;
&lt;br /&gt;
This task took me awhile to figure out, was thinking on using recursive functions at first but it seems the most logical way is the following:&lt;br /&gt;
I had a few problems are first with the node going up to its parent but it was going back to itself, then I added &amp;amp;&amp;amp;node-&amp;gt;parent-&amp;gt;right != node to stop it from going back to itself&lt;br /&gt;
&lt;br /&gt;
Next in Preorder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Node* next_pre( Node* node ) {&lt;br /&gt;
&lt;br /&gt;
	if(node-&amp;gt;left != empty) {&lt;br /&gt;
		return node-&amp;gt;left;&lt;br /&gt;
	}&lt;br /&gt;
	if(node-&amp;gt;right != empty) {&lt;br /&gt;
		return node-&amp;gt;right;&lt;br /&gt;
	}&lt;br /&gt;
	while(node-&amp;gt;parent != 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;
			return node-&amp;gt;parent-&amp;gt;right;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return empty;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Previous in Preorder&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Node* prev_pre( Node* node ) {&lt;br /&gt;
	if(node-&amp;gt;parent != empty &amp;amp;&amp;amp; node-&amp;gt;parent-&amp;gt;left != empty &amp;amp;&amp;amp; nod) {&lt;br /&gt;
		return node-&amp;gt;parent-&amp;gt;left;&lt;br /&gt;
	}&lt;br /&gt;
	if(node-&amp;gt;parent != empty) {&lt;br /&gt;
		return parent;&lt;br /&gt;
	} else {&lt;br /&gt;
		return empty;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>