<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[tree iterator]]></title><description><![CDATA[<p>hi,</p>
<p>wie kann ich den iterator bis zum letzten element laufen lassen?<br />
tree::treeiterator it = t.begin(); it != t.end(); it = it.next()<br />
wenn it == i.end ist wird die schleife ja nicht mehr ausgeführt...</p>
<pre><code class="language-cpp">class tree 
{ 
private: 
    class node *root; 

public: 
    class treeiterator 
    { 
    private: 
        std::stack&lt;class node*&gt; stack; 
        class node *now; 
        class node *end; 
        class tree *ptree; 
        bool left; 
        bool right; 

    public: 
        treeiterator(class tree *tree_): now(NULL), left(false), right(false) 
        { 
            ptree = tree_; 
        } 

        void start_at_beginning() 
        { 
            now = ptree-&gt;get_root_node(); 
            stack.push(now); 
        } 

        void start_at_end() 
        { 
            now = ptree-&gt;get_root_node(); 
            std::stack&lt;class node*&gt; stack_tmp; 

            while(true) 
            { 
                if(now-&gt;left) 
                { 
                    stack_tmp.push(now-&gt;right); 
                } 
                if(now-&gt;right) 
                { 
                    stack_tmp.push(now-&gt;left); 
                } 

                if (!stack_tmp.empty()) 
                { 
                    now = stack_tmp.top(); 
                    stack_tmp.pop(); 
                } 
                else 
                { 
                    break; 
                } 
            } 
        } 

        class node *get_node() 
        { 
            return now; 
        } 

        treeiterator &amp;next() // next iterator for Depth first Search 
        { 
            if (now-&gt;left) 
            { 
                stack.push(now-&gt;right); 
            } 
            if (now-&gt;right) 
            { 
                stack.push(now-&gt;left); 
            } 
            if (!stack.empty()) 
            { 
                now = stack.top(); 
                stack.pop(); 
            } 
            else 
            { 
                now = NULL; 
            } 

            return *this; 
        } 

        bool operator== (treeiterator &amp;it) 
        { 
            return this-&gt;get_node() == it.get_node(); 
        } 

        bool operator!= (treeiterator &amp;it) 
        { 
            return this-&gt;get_node() != it.get_node(); 
        } 

        node operator*() 
        { 
            return *get_node(); 
        } 
    }; 

public: 
    tree(): root(NULL) {} 

    class node *get_root_node() 
    { 
        return root; 
    } 

    class treeiterator begin() 
    { 
        class treeiterator it(this); 
        it.start_at_beginning(); 
        return it; 
    } 

    class treeiterator end() 
    { 
        class treeiterator it(this); 
        it.start_at_end(); 
        return it; 
    } 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/303537/tree-iterator</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 06:31:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303537.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 May 2012 13:40:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to tree iterator on Wed, 16 May 2012 13:40:36 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>wie kann ich den iterator bis zum letzten element laufen lassen?<br />
tree::treeiterator it = t.begin(); it != t.end(); it = it.next()<br />
wenn it == i.end ist wird die schleife ja nicht mehr ausgeführt...</p>
<pre><code class="language-cpp">class tree 
{ 
private: 
    class node *root; 

public: 
    class treeiterator 
    { 
    private: 
        std::stack&lt;class node*&gt; stack; 
        class node *now; 
        class node *end; 
        class tree *ptree; 
        bool left; 
        bool right; 

    public: 
        treeiterator(class tree *tree_): now(NULL), left(false), right(false) 
        { 
            ptree = tree_; 
        } 

        void start_at_beginning() 
        { 
            now = ptree-&gt;get_root_node(); 
            stack.push(now); 
        } 

        void start_at_end() 
        { 
            now = ptree-&gt;get_root_node(); 
            std::stack&lt;class node*&gt; stack_tmp; 

            while(true) 
            { 
                if(now-&gt;left) 
                { 
                    stack_tmp.push(now-&gt;right); 
                } 
                if(now-&gt;right) 
                { 
                    stack_tmp.push(now-&gt;left); 
                } 

                if (!stack_tmp.empty()) 
                { 
                    now = stack_tmp.top(); 
                    stack_tmp.pop(); 
                } 
                else 
                { 
                    break; 
                } 
            } 
        } 

        class node *get_node() 
        { 
            return now; 
        } 

        treeiterator &amp;next() // next iterator for Depth first Search 
        { 
            if (now-&gt;left) 
            { 
                stack.push(now-&gt;right); 
            } 
            if (now-&gt;right) 
            { 
                stack.push(now-&gt;left); 
            } 
            if (!stack.empty()) 
            { 
                now = stack.top(); 
                stack.pop(); 
            } 
            else 
            { 
                now = NULL; 
            } 

            return *this; 
        } 

        bool operator== (treeiterator &amp;it) 
        { 
            return this-&gt;get_node() == it.get_node(); 
        } 

        bool operator!= (treeiterator &amp;it) 
        { 
            return this-&gt;get_node() != it.get_node(); 
        } 

        node operator*() 
        { 
            return *get_node(); 
        } 
    }; 

public: 
    tree(): root(NULL) {} 

    class node *get_root_node() 
    { 
        return root; 
    } 

    class treeiterator begin() 
    { 
        class treeiterator it(this); 
        it.start_at_beginning(); 
        return it; 
    } 

    class treeiterator end() 
    { 
        class treeiterator it(this); 
        it.start_at_end(); 
        return it; 
    } 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2212248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212248</guid><dc:creator><![CDATA[iter]]></dc:creator><pubDate>Wed, 16 May 2012 13:40:36 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Wed, 16 May 2012 13:48:36 GMT]]></title><description><![CDATA[<p>iterator::end() ist zeigt normalerweise nicht auf ein Element eines Containers.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212253</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 16 May 2012 13:48:36 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Wed, 16 May 2012 13:57:17 GMT]]></title><description><![CDATA[<p>wie mach ich das nun hier?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212254</guid><dc:creator><![CDATA[iter]]></dc:creator><pubDate>Wed, 16 May 2012 13:57:17 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Wed, 16 May 2012 14:03:38 GMT]]></title><description><![CDATA[<p>iter schrieb:</p>
<blockquote>
<p>wie mach ich das nun hier?</p>
</blockquote>
<p>Vielleicht sowas in der Art:</p>
<pre><code class="language-cpp">void start_at_end()
        {
            now = NULL;
        }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2212260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212260</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 May 2012 14:03:38 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Sat, 19 May 2012 00:54:05 GMT]]></title><description><![CDATA[<p>leider brauche ich bei dieser version: bool visited_left und bool visited_right...<br />
gehts auch ohne, wenn ich den parent pointer verwende?</p>
<pre><code class="language-cpp">class node
{
public:
	class node *parent;
	class node *left;
	class node *right;

	bool visited_left;
	bool visited_right;
	int value;

	node(): parent(NULL), left(NULL), right(NULL), value(0), visited_left(false), visited_right(false) {}
};

		treeiterator &amp;next() // next iterator for Depth first Search
		{
			if(!now-&gt;visited_left)
			{
				if(now-&gt;left)
				{
					now-&gt;visited_left = true;
					now = now-&gt;left;

					return *this;
				}
			}
			if(!now-&gt;visited_right)
			{
				if(now-&gt;right)
				{
					now-&gt;visited_right = true;
					now = now-&gt;right;

					return *this;
				}
			}
			if(now-&gt;visited_left &amp;&amp; now-&gt;visited_right &amp;&amp; now == ptree-&gt;get_root_node())
			{	
				now = NULL;
			}
			else
			{
				now = now-&gt;parent;
				return next();
			}

			return *this;
		}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2212994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212994</guid><dc:creator><![CDATA[iter]]></dc:creator><pubDate>Sat, 19 May 2012 00:54:05 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Sat, 19 May 2012 06:27:43 GMT]]></title><description><![CDATA[<p>Du musst Dir im Baum keine extra Traversierungs-Flags merken; denn die Reihenfolge steht ja fest und du kannst den kompletten Baum von überall aus navigieren, wenn du parent-Links hast. Im Iterator brauchst Du auch nur einen Zeiger, wenn mich nicht alles täuscht.</p>
<p>Ein traversiertechnischer Nachfolger für die inorder-Reihenfolge müsste sich so bestimmen lassen. Pseudo-Code:</p>
<pre><code>node* leftmost_node(node* tree)
{
  assert(tree!=0);
  while (tree-&gt;left) tree = tree-&gt;left;
  return tree;
}

node* closest_right_ancestor(node* from)
{
  assert(from!=0);
  for (node* p; (p=from-&gt;parent)!=0; from=p)
    if (p-&gt;left==from) return p;
  return 0; // does not exist
}

node* next_inorder(node* current)
{
  assert(current!=0);
  if (current-&gt;right) return leftmost_node(current-&gt;right);
  return closest_right_ancestor(current);
}
</code></pre>
<p>wobei du hier leftmost_node gleich noch für den begin-Iterator wiederverwenden kannst.</p>
<p>Die anderen Traversierungen (next_preorder und next_postorder) sollten jetzt auch nicht komplizierter sein ...</p>
<p>Alle Angaben ohne Gewähr, da Code ungetestet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213002</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 19 May 2012 06:27:43 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Sat, 19 May 2012 10:32:37 GMT]]></title><description><![CDATA[<p>hm...bist du dir sicher das funktioniert so?<br />
warum das hier?</p>
<pre><code class="language-cpp">if (current-&gt;right) return leftmost_node(current-&gt;right);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2213048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213048</guid><dc:creator><![CDATA[iter]]></dc:creator><pubDate>Sat, 19 May 2012 10:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Sat, 19 May 2012 12:47:40 GMT]]></title><description><![CDATA[<p>iter schrieb:</p>
<blockquote>
<p>bist du dir sicher das funktioniert so?</p>
</blockquote>
<p>Ziemlich.</p>
<p>iter schrieb:</p>
<blockquote>
<p>warum das hier?</p>
<pre><code class="language-cpp">if (current-&gt;right) return leftmost_node(current-&gt;right);
</code></pre>
</blockquote>
<p>Wenn &quot;current&quot; der aktuelle Knoten in der inorder-Traversierung ist, dann haben wir den linken Teilbaum schon komplett abgegrast (falls es den überhaupt gibt). Als nächstes wäre also der rechte Teilbaum dran. Und was ist der &quot;erste&quot; Knoten eines Baumes im inorder-Sinne? Das ist doch der Knoten, der am &quot;weitesten links steht&quot;. Den erreiche ich über leftmost_node(wurzel). Die Wurzel des rechten Teilbaums ist ja current-&gt;right.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213097</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 19 May 2012 12:47:40 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Sat, 19 May 2012 22:16:21 GMT]]></title><description><![CDATA[<p>wie soll er den linken teilbaun abgrasen wenn du mit dem rechten startest?</p>
<pre><code class="language-cpp">if (current-&gt;right) return leftmost_node(current-&gt;right);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2213274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213274</guid><dc:creator><![CDATA[iter]]></dc:creator><pubDate>Sat, 19 May 2012 22:16:21 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Sat, 19 May 2012 22:17:50 GMT]]></title><description><![CDATA[<p>ich gehe davon aus das du mit root startest...<br />
dann ist current-&gt;right ...doch root-&gt;right</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213276</guid><dc:creator><![CDATA[iter]]></dc:creator><pubDate>Sat, 19 May 2012 22:17:50 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Sat, 19 May 2012 22:38:17 GMT]]></title><description><![CDATA[<p>Entscheide dich doch erstmal, in welcher Reihenfolge Du dem Nutzer die Knoten präsentieren willst. Ich bin jetzt von einer inorder-Traversierung ausgegangen. Und da fängt man nicht mit der Wurzel sondern mit leftmost_node(wurzel) an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213280</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 19 May 2012 22:38:17 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Sat, 19 May 2012 23:28:57 GMT]]></title><description><![CDATA[<p>in der gleichen reihenfolge wie hier:</p>
<pre><code class="language-cpp">treeiterator &amp;next() // next iterator for Depth first Search
		{
			if (now-&gt;right) 
			{
				stack.push(now-&gt;right);
			}
			if (now-&gt;left) 
			{
				stack.push(now-&gt;left);
			}

			if (!stack.empty()) 
			{ 
				now = stack.top(); 
				stack.pop();
			}
			else
			{
				now = NULL;
			}

                        return *this;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2213287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213287</guid><dc:creator><![CDATA[iter]]></dc:creator><pubDate>Sat, 19 May 2012 23:28:57 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Sat, 19 May 2012 23:33:30 GMT]]></title><description><![CDATA[<p>also pr-order transversal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213288</guid><dc:creator><![CDATA[iter]]></dc:creator><pubDate>Sat, 19 May 2012 23:33:30 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Sun, 20 May 2012 08:32:25 GMT]]></title><description><![CDATA[<p>Auch das ließe sich dank parent-Links ohne stack im Iterator realisieren.</p>
<p>Für einen Suchbaum ist diese Reihenfolge nicht praktisch, da der Nutzer keine sortierte Sequenz sehen würde. Deswegen bin ich von inorder ausgegangen. Aber das ist ja deine Sache mit der Reihenfolge.</p>
<p>Jetzt nachdem du die inorder-Variante gesehen hast, die im übrigen funktioniert (habe sie jetzt getestet), sollte es für dich kein Problem sein, darauf zu kommen, wie die preorder-Variante aussieht. Meine Hilfe zum Tarif &quot;kostenlos&quot; hast Du zu diesem Thema jetzt ausgereizt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213318</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 20 May 2012 08:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Mon, 21 May 2012 13:31:24 GMT]]></title><description><![CDATA[<p>solution:</p>
<pre><code class="language-cpp">class node* closest_right_ancestor1(class node* from)
		{
		  assert(from!=0); 
		  for (node* p = from; p != 0; p = p-&gt;parent)
		  {
			if (p-&gt;left == from) return p-&gt;right; 
			from = p;
		  }
		  return 0; // does not exist 
		}

		treeiterator &amp;next() // next iterator for Depth first Search
		{
			assert(now!=0); 
			if (now-&gt;left)
			{
				now = now-&gt;left;
				return *this;
			}
			if (now-&gt;right) 
			{
				now = now-&gt;right; 
				return *this;
			}
			now = closest_right_ancestor(now);
		}
</code></pre>
<p>kann man breath first search auch ohne zusätzlichen speicher implementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213785</guid><dc:creator><![CDATA[iter]]></dc:creator><pubDate>Mon, 21 May 2012 13:31:24 GMT</pubDate></item><item><title><![CDATA[Reply to tree iterator on Mon, 21 May 2012 14:41:35 GMT]]></title><description><![CDATA[<p>Das ist keine Lösung. Es erzeugt bei</p>
<pre><code>[2]
     /   \
  [1]     [3]
</code></pre>
<p>die Endlosschleife: 2,1,2,1,2,1,2,1,...</p>
<p>Außerdem fehlt da noch ein return am Ende.</p>
<p>Und lass das <code>class</code> bei <code>class node*</code> weg.</p>
<p>closest_right_ancestor hast du auch verschlimmbessert. Aber die brauchst du hier eh nicht, die Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2213808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2213808</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 21 May 2012 14:41:35 GMT</pubDate></item></channel></rss>