<?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[Problem mit Binärem Baum (Klassendesign)]]></title><description><![CDATA[<p>Hallo,</p>
<p>in meinem Code baue ich einen Baum auf bestehend aus den folgenden Klassen:</p>
<pre><code>struct node
{
	double weight;
};

struct internal_node
	: public node
{
	node *left;
	node *right;
};

struct value_node
	: public node
{
	char value;
};
</code></pre>
<p>EIne <em>internal_node</em> kann also nochmal eine <em>internal_node</em> &quot;beinhalten&quot;, oder eine <em>value_node</em>. Die <em>value_node</em>s befinden sich logischerweise ganz unten im Baum.</p>
<p>Wie kann ich jetzt von dem ersten Knoten dem Baum bis zu den jeweiligen <em>value_node</em>s folgen? Ich weiß ja nicht, um was es sich handelt. Möglichkeit wäre ein bool in der struct <em>node</em> + dynamic_cast aber das ist ja fürn Arsch.</p>
<p>Mein Design ist also kaputt, hat jemand eine Idee wie ich das lösen kann?</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/329167/problem-mit-binärem-baum-klassendesign</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 01:13:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/329167.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Nov 2014 09:51:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Binärem Baum (Klassendesign) on Tue, 11 Nov 2014 09:51:26 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>in meinem Code baue ich einen Baum auf bestehend aus den folgenden Klassen:</p>
<pre><code>struct node
{
	double weight;
};

struct internal_node
	: public node
{
	node *left;
	node *right;
};

struct value_node
	: public node
{
	char value;
};
</code></pre>
<p>EIne <em>internal_node</em> kann also nochmal eine <em>internal_node</em> &quot;beinhalten&quot;, oder eine <em>value_node</em>. Die <em>value_node</em>s befinden sich logischerweise ganz unten im Baum.</p>
<p>Wie kann ich jetzt von dem ersten Knoten dem Baum bis zu den jeweiligen <em>value_node</em>s folgen? Ich weiß ja nicht, um was es sich handelt. Möglichkeit wäre ein bool in der struct <em>node</em> + dynamic_cast aber das ist ja fürn Arsch.</p>
<p>Mein Design ist also kaputt, hat jemand eine Idee wie ich das lösen kann?</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2426965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426965</guid><dc:creator><![CDATA[node_tree_prob]]></dc:creator><pubDate>Tue, 11 Nov 2014 09:51:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Binärem Baum (Klassendesign) on Tue, 11 Nov 2014 10:04:16 GMT]]></title><description><![CDATA[<p>ich würde nur eine node haben nämlich die die intern benutzt wird. Dann castest du nicht. Und der user kriegt einen iterator der die node versteckt, aber nur ein pointer auf eine node ist und die aktuelle position designiert.<br />
die letzten Knoten haben halt bei left und right null pointer verweise und du gehst halt solang rein bis du zwei null pointer triffst dann bist du am Ende. du bist am Anfang wenn der parent, welchen du auch einbauen solltest, null pointer ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2426967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426967</guid><dc:creator><![CDATA[randa]]></dc:creator><pubDate>Tue, 11 Nov 2014 10:04:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Binärem Baum (Klassendesign) on Tue, 11 Nov 2014 11:21:36 GMT]]></title><description><![CDATA[<p>Falls Du nicht auf die Ableitung verzichten möchtest, so gäbe es die Möglichkeit zwei virtuelle Methoden hinzuzufügen:</p>
<pre><code>struct node
{
    virtual node* get_left() const = 0;
    virtual node* get_right() const = 0;
    double weight;
};

struct internal_node
    : public node
{
    virtual node* get_left() const override
    {
        return left;
    }
    virtual node* get_right() const override
    {
        return right;
    }
    node *left;
    node *right;
};

struct value_node
    : public node
{
    virtual node* get_left() const override
    {
        return nullptr;
    }
    virtual node* get_right() const override
    {
        return nullptr;
    }
    char value;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2426980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426980</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 11 Nov 2014 11:21:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Binärem Baum (Klassendesign) on Tue, 11 Nov 2014 12:07:50 GMT]]></title><description><![CDATA[<p>.. weil es eine weitere Möglichkeit ist, und weil ich das schon immer mal ausprobieren wollte:<br />
Hier mal eine Lösung mit <a href="http://de.wikipedia.org/wiki/Besucher_%28Entwurfsmuster%29" rel="nofollow">Visitor-Pattern</a></p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cassert&gt;
#include &lt;stdexcept&gt;

struct internal_node;
struct value_node;

class Visitor
{
public:
    virtual void visit( internal_node&amp; nd ) = 0;
    virtual void visit( value_node&amp; nd ) = 0;
};

// --  Baumstruktur
struct node
{
    virtual void accept( Visitor&amp; v ) = 0;
    double weight;
};

struct internal_node
    : public node
{
    virtual void accept( Visitor&amp; v ) override
    {
        v.visit( *this );
    }
    node *left;
    node *right;
};

struct value_node
    : public node
{
    virtual void accept( Visitor&amp; v ) override
    {
        v.visit( *this );
    }
    char value;
};

// --  konkrete Visitor
class TraverseAndPrint : public Visitor
{
public:
    TraverseAndPrint( const char* path )
        : m_path( path )
        , m_pos( begin(m_path) )
    {}
    virtual void visit( internal_node&amp; nd ) override
    {
        if( m_pos == end( m_path ) )
            throw std::invalid_argument( &quot;'path' passt nicht zum Baum&quot; );
        node* next = *m_pos == 'r' ? nd.right : nd.left;
        assert( next );
        ++m_pos;
        next-&gt;accept( *this );
    }
    virtual void visit( value_node&amp; nd ) override
    {
        assert( m_pos == end( m_path ) );
        std::cout &lt;&lt; &quot;Value = '&quot; &lt;&lt; nd.value &lt;&lt; &quot;'&quot; &lt;&lt; std::endl;
    }

private:
    std::string m_path;
    std::string::const_iterator m_pos;
};

int main()
{
    value_node blatt_rl;
    blatt_rl.value = 'X';
    internal_node unter;
    unter.left = &amp;blatt_rl;
    internal_node root;
    root.right = &amp;unter;

    TraverseAndPrint v( &quot;rl&quot; );
    root.accept( v );
}
</code></pre>
<p>Der Vorteil dieser Lösung besteht darin, dass man außer <code>TraverseAndPrint</code> auch andere Visitor-Typen mit neuer Funktionalität erzeugen kann, ohne an der Baumstruktur irgendetwas ändern zu müssen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2426992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426992</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 11 Nov 2014 12:07:50 GMT</pubDate></item></channel></rss>