<?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[AVL-Baum mit Iterator durchiterieren]]></title><description><![CDATA[<p>Hi,<br />
ich habe einen AVL-Baum geschrieben und würde den gerne mit einem Iterator durchiterieren, d. h., nicht mit einem rekursivem InOrder-Traversal. Aber irgendwie scheint mir das ungleich schwieriger zu sein.<br />
Ich habe mir gedacht, dass ich beim Aufbau des Baumes einfach einen zusätzlichen Zeiger einbaue der auf das nächste Element zeigt, aber das ist beim rechten untersten Knoten bei einem Teilbaum schwierig, da dieser im Extremfall auf die Wurzel zeigt.<br />
Irgendjemand eine Idee, wie ich das schön und effizient umsetze?</p>
<p>Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/335602/avl-baum-mit-iterator-durchiterieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Apr 2026 10:19:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/335602.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 29 Nov 2015 13:03:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Sun, 29 Nov 2015 13:03:26 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich habe einen AVL-Baum geschrieben und würde den gerne mit einem Iterator durchiterieren, d. h., nicht mit einem rekursivem InOrder-Traversal. Aber irgendwie scheint mir das ungleich schwieriger zu sein.<br />
Ich habe mir gedacht, dass ich beim Aufbau des Baumes einfach einen zusätzlichen Zeiger einbaue der auf das nächste Element zeigt, aber das ist beim rechten untersten Knoten bei einem Teilbaum schwierig, da dieser im Extremfall auf die Wurzel zeigt.<br />
Irgendjemand eine Idee, wie ich das schön und effizient umsetze?</p>
<p>Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477503</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Sun, 29 Nov 2015 13:03:26 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Sun, 29 Nov 2015 13:27:42 GMT]]></title><description><![CDATA[<p>In jedem Knoten einen Zeiger auf den Papa dürfte leichter zu handhaben sein.</p>
<p>Würde es reichen, die beiden letzten besuchten Knoten zu kennen? Dann wüßtest Du immer, ob Du vom Kind oder vom Papa kommst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477504</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 29 Nov 2015 13:27:42 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Sun, 29 Nov 2015 14:10:17 GMT]]></title><description><![CDATA[<p>DV: Lüke, ich bin dein Papa!<br />
L: Neeeeiiiinnnn!!!!!</p>
<p>Ich habe auch schon daran gedacht, aber das reicht ja nicht aus für Direkt-Verknüpfungen. Wenn du dir Knoten 9 anschaust, der braucht eine Direkt-Verknüpfung mit der Wurzel. Die wäre der Ururgroßpapa.<br />
Also was machen?!</p>
<p><a href="http://www.fotos-hochladen.net/view/avlulpa3frw10.jpg" rel="nofollow">http://www.fotos-hochladen.net/view/avlulpa3frw10.jpg</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477510</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Sun, 29 Nov 2015 14:10:17 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Sun, 29 Nov 2015 15:12:18 GMT]]></title><description><![CDATA[<p>Man braucht keine Direktverbindung. Man kann sich über die Parent Zeiger ja bis zur Wurzel hocharbeiten. Der Algorithmus das nächste Elemente zu finden müsste so aussehen:</p>
<pre><code>Hat der aktuelle Knoten ein rechtes Kind?
 -&gt; Ja: Gehe zu diesem und dann solange zum linken Kind bis es keins mehr gibt
 -&gt; Nein: Gehe zum Elternknoten und widerhole dies solange bis man vom linken Kind in den Elternknoten kommt
</code></pre>
<p>Hab ich mir gerade überlegt, könnten also noch Fehler drin sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477521</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Sun, 29 Nov 2015 15:12:18 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Sun, 29 Nov 2015 15:43:16 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>Man braucht keine Direktverbindung. Man kann sich über die Parent Zeiger ja bis zur Wurzel hocharbeiten. Der Algorithmus das nächste Elemente zu finden müsste so aussehen:</p>
<pre><code>Hat der aktuelle Knoten ein rechtes Kind?
 -&gt; Ja: Gehe zu diesem und dann solange zum linken Kind bis es keins mehr gibt
 -&gt; Nein: Gehe zum Elternknoten und widerhole dies solange bis man vom linken Kind in den Elternknoten kommt
</code></pre>
<p>Hab ich mir gerade überlegt, könnten also noch Fehler drin sein.</p>
</blockquote>
<p>Wenn du dir mal meine Zeichnung anschaust und dir vorstellst, dass der Startpunkt ein rechtes Kind mit dem Wert 1.5 hast, kommst du so in eine Endlosrekursion.</p>
<pre><code>Sei 1.5 rechtes Kind von 1, dann gilt:

Hat 1 ein rechtes Kind? --&gt; Ja, 1.5
Gehe zu 1.5
Hat 1.5 ein rechts Kind? --&gt; Nein, gehe zu Elternknoten 1.
Hat 1 ein rechtes Kind? Ja, 1.5.
Gehe zu 1.5
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2477526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477526</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Sun, 29 Nov 2015 15:43:16 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Sun, 29 Nov 2015 17:19:06 GMT]]></title><description><![CDATA[<p>Dann kommst du aber vom rechten Kind in den Elternknoten. Wenn das passiert gehst du zum Elternknoten vom Elternknoten usw. bis du wirklich von links in den Knoten kommst. Gibt es keine Elternknoten mehr, bist du also von rechts in die Wurzel gekommen hast du alle Konten besucht und bist fertig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477536</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Sun, 29 Nov 2015 17:19:06 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Sun, 29 Nov 2015 17:27:29 GMT]]></title><description><![CDATA[<p>Bei Google findet man über &quot;inorder successor binary tree&quot; übrigens genau was ich mir überlegt hab. <a href="http://www.geeksforgeeks.org/inorder-successor-in-binary-search-tree/" rel="nofollow">http://www.geeksforgeeks.org/inorder-successor-in-binary-search-tree/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477537</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Sun, 29 Nov 2015 17:27:29 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Sun, 29 Nov 2015 18:53:00 GMT]]></title><description><![CDATA[<p>Ah, jetzt verstehe ich dich! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Vielen Dank! Werde ich mal ausprobieren! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>L. G.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477548</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Sun, 29 Nov 2015 18:53:00 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Sun, 29 Nov 2015 22:11:55 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>hat jemand eine Idee, weshalb ich bei Zeile 230 beim bool operator== immer null reingeliefert bekomme und die Membervariable ptr (Zeile 192) zu diesem Zeitpunkt ebenfalls null ist?! Ich bekomme deswegen am Ende, nach dem alle Elemente ausgegeben wurden, folgenden Fehler:</p>
<blockquote>
<p>double free or corruption (out): 0x00007ffe4d7f4100 ***</p>
</blockquote>
<pre><code>#ifndef AVLTREE_H
#define AVLTREE_H

#include &lt;memory&gt;
#include &lt;algorithm&gt;
#include &lt;assert.h&gt;
#include &lt;iterator&gt;
#include &lt;iostream&gt;

template &lt;typename T&gt;
class AVLTree
{
private:
  class Node
  {
  public:
    int height = 0;
    T value;

    std::shared_ptr&lt;Node&gt; left = nullptr;
    std::shared_ptr&lt;Node&gt; right = nullptr;
    std::shared_ptr&lt;Node&gt; parent = nullptr;

    Node(T v)
      : value(v)
    {
    }

    // Kleiner-Ordnung
    bool operator&lt;(const T&amp; _value) const { return value &lt; _value; }
  };

  std::shared_ptr&lt;Node&gt; root = nullptr;

  int getHeight(std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr)
      return -1;
    else
      return p-&gt;height;
  }

  int getBalance(std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr)
      return 0;
    else
      return getHeight(p-&gt;right) - getHeight(p-&gt;left);
  }

  std::shared_ptr&lt;Node&gt; insertR(T value, std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr) {
      p = std::make_shared&lt;Node&gt;(value);
    } else if (value &lt; p-&gt;value)
    {
      std::shared_ptr&lt;Node&gt; temp = insertR(value, p-&gt;left);
      p-&gt;left = temp;
      temp-&gt;parent = p;
    }
    else if (value &gt; p-&gt;value)
    {
        std::shared_ptr&lt;Node&gt; temp = insertR(value, p-&gt;right);
        p-&gt;right = temp;
        temp-&gt;parent = p;
    }

    p = balance(p);

    return p;
  }

  std::shared_ptr&lt;Node&gt; balance(std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr)
      return nullptr;

    p-&gt;height = std::max(getHeight(p-&gt;left), getHeight(p-&gt;right)) + 1;

    if (getBalance(p) == -2) {
      if (getBalance(p-&gt;left) &lt;= 0)
        p = rotateRight(p);
      else
        p = rotateLeftRight(p);
    } else if (getBalance(p) == 2) {
      if (getBalance(p-&gt;right) &gt;= 0)
        p = rotateLeft(p);
      else
        p = rotateRightLeft(p);
    }

    return p;
  }

  std::shared_ptr&lt;Node&gt; rotateRight(std::shared_ptr&lt;Node&gt; p)
  {
    assert(p-&gt;left != nullptr);

    std::shared_ptr&lt;Node&gt; q = p-&gt;left;
    p-&gt;left = q-&gt;right;
    q-&gt;right = p;

    p-&gt;height = std::max(getHeight(p-&gt;left), getHeight(p-&gt;right)) + 1;
    q-&gt;height = std::max(getHeight(q-&gt;left), getHeight(q-&gt;right)) + 1;

    q-&gt;parent = p-&gt;parent;
    q-&gt;right-&gt;parent = p;
    p-&gt;parent = q;

    return q;
  }

  std::shared_ptr&lt;Node&gt; rotateLeft(std::shared_ptr&lt;Node&gt; p)
  {
    assert(p-&gt;right != nullptr);

    std::shared_ptr&lt;Node&gt; q = p-&gt;right;
    p-&gt;right = q-&gt;left;
    q-&gt;left = p;

    p-&gt;height = std::max(getHeight(p-&gt;left), getHeight(p-&gt;right)) + 1;
    q-&gt;height = std::max(getHeight(q-&gt;left), getHeight(q-&gt;right)) + 1;

    q-&gt;parent = p-&gt;parent;
    q-&gt;left-&gt;parent = p;
    p-&gt;parent = q;

    return q;
  }

  std::shared_ptr&lt;Node&gt; rotateLeftRight(std::shared_ptr&lt;Node&gt; p)
  {
    assert(p-&gt;left != nullptr);

    p-&gt;left = rotateLeft(p-&gt;left);
    return rotateRight(p);
  }

  std::shared_ptr&lt;Node&gt; rotateRightLeft(std::shared_ptr&lt;Node&gt; p)
  {
    assert(p-&gt;right != nullptr);

    p-&gt;right = rotateRight(p-&gt;right);
    return rotateLeft(p);
  }

  bool contains(T value, std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr) {
      return false;
    } else {
      if (value &lt; *p) {
        contains(value, p-&gt;left);
      } else {
        if (value &gt; *p) {
          contains(value, p-&gt;right);
        } else {
          return true;
        }
      }
    }
  }

  std::shared_ptr&lt;Node&gt; findMax(std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr) {
      return p;
    } else {
      while (p-&gt;right != nullptr) {
        p = p-&gt;right;
      }
      return p;
    }
  }

  std::shared_ptr&lt;Node&gt; findMin(std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr) {
      return p;
    } else {
      while (p-&gt;left != nullptr) {
        p = p-&gt;left;
      }
      return p;
    }
  }

  struct iterator : std::iterator&lt;std::forward_iterator_tag, T&gt;
  {
    std::shared_ptr&lt;AVLTree&gt; tree;
    std::shared_ptr&lt;Node&gt; ptr;

    explicit iterator()
      : ptr(nullptr)
    {
    }

    explicit iterator(std::shared_ptr&lt;AVLTree&gt; tree, std::shared_ptr&lt;Node&gt; p)
      : tree(tree),
        ptr(p)
    {
      while (ptr-&gt;left != nullptr) {
        ptr = ptr-&gt;left;
      }
    }

    T&amp; operator*()
    {
      return ptr-&gt;value;
    }

    iterator&amp; operator++()
    {
      if (ptr != nullptr)
      {
        ptr = inOrderSuccessor(ptr);
      }

      return *this;
    }

    iterator operator++(int)
    {
      iterator tmp = *this;
      ++*this;
      return tmp;
    }

    bool operator==(const iterator&amp; other) const { return ptr == other.ptr; }
    bool operator!=(const iterator&amp; other) const { return ptr != other.ptr; }

  private:
    std::shared_ptr&lt;Node&gt; inOrderSuccessor(std::shared_ptr&lt;Node&gt; n)
    {
      // step 1 of the above algorithm
      if (n-&gt;right != nullptr)
        return tree-&gt;findMin(n-&gt;right);

      // step 2 of the above algorithm
      std::shared_ptr&lt;Node&gt; p = n-&gt;parent;
      while (p != nullptr &amp;&amp; n == p-&gt;right) {
        n = p;
        p = p-&gt;parent;
      }
      return p;
    }
  };

public:
  iterator begin()
  {
      std::shared_ptr&lt;AVLTree&gt; thisPtr(this);
      return iterator(thisPtr, root);
  }
  iterator end() { return iterator(); }

  void insert(T value)
  {
    if (root == nullptr) {
      root = std::make_shared&lt;Node&gt;(value);
    } else {
      insertR(value, root);
    }
  }

  bool contains(T value) { return contains(value, root); }

  T findMax() { findMax(root)-&gt;value; }
};

#endif // AVLTREE_H
</code></pre>
<pre><code>#include &quot;avltree.h&quot;
#include &lt;iostream&gt;

int main()
{
    AVLTree&lt;int&gt; tree;
    tree.insert(5);
    tree.insert(3);
    tree.insert(8);
    tree.insert(10);
    tree.insert(-15);
    tree.insert(100);
    tree.insert(-4);
    tree.insert(0);
    tree.insert(17);
    tree.insert(200);
    tree.insert(101);
    tree.insert(151);
    tree.insert(300);

    std::cout &lt;&lt; &quot;Test&quot; &lt;&lt; std::endl;

    for (int elem : tree) {
        std::cout &lt;&lt; elem &lt;&lt; &quot;,&quot;;
    }

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2477569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477569</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Sun, 29 Nov 2015 22:11:55 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 08:42:28 GMT]]></title><description><![CDATA[<p>Ich habe mir deinen Code nicht komplett angeschaut, aber dieses Stück ist mit Sicherheit ein Fehler:</p>
<pre><code>std::shared_ptr&lt;AVLTree&gt; thisPtr(this);
</code></pre>
<p>Dein Tree ist doch gar nicht dynamisch reserivert, sondern liegt auf dem Stack. Und selbst wenn es dynamisch wäre könntest du nicht so einfach den Besitz einem shared_ptr übergeben. Wenn du unbedingt einen shared_ptr auf this brauchst gibt es std::enable_shared_from_this. Aber hier reicht eigentlich ein normaler Pointer. Iteratoren sind nur so lange gültig wie die Struktur zu der sie gehören, fertig. Macht die STL auch so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477613</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Mon, 30 Nov 2015 08:42:28 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 11:48:42 GMT]]></title><description><![CDATA[<p>Stimmt, da hast du recht! Einen Speicherbereich implizit zu zerstören, der auf dem Stack liegt, macht einfach keinen Sinn!</p>
<p>Danke, da hätte ich lange gebraucht, um darauf zu kommen!</p>
<p>L. G.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477633</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Mon, 30 Nov 2015 11:48:42 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 13:17:00 GMT]]></title><description><![CDATA[<p>Im übrigen hat dein Code auch noch ein Memory Leak. Du hast mit deinen <code>shared_ptr</code> eine zyklische Abhängigkeit zwischen Parent und Child aufgebaut. Der Parent Pointer kann ein ganz normaler Pointer sein, da das Child ja mindestens so lange lebt wie das Parent. Außerdem gibt es keinen Grund für <code>shared_ptr</code> überall. Du kopierst diese ständig unnötig und hast dadurch Overhead für den Reference Counter. Hier wäre <code>unique_ptr</code> für den Besitz und normale Pointer für das drumherum sinnvoller. Ist aber vermutlich größere Arbeit das umzustellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477640</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Mon, 30 Nov 2015 13:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 16:07:51 GMT]]></title><description><![CDATA[<p>Vor allem funktioniert das Balancing nicht, wenn ich das aktiviere... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477659</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Mon, 30 Nov 2015 16:07:51 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 16:34:14 GMT]]></title><description><![CDATA[<p>Wenn du was aktivierst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477666</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Mon, 30 Nov 2015 16:34:14 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 16:56:25 GMT]]></title><description><![CDATA[<p>Sorry, dumm ausgedrückt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Zeile 68:</p>
<pre><code>p = balance(p);
</code></pre>
<p>Hatte ich erst mal auskommentiert, um zu sehen, dass das InOrder-Feature ohne Balancing funktioniert. Das tut es. Mit Balancing funktioniert es nicht mehr. Ich hatte versucht beim Balancing die neuen Eltern richtig zu setzen, allerdings stimmt das Ergebnis einfach nicht.</p>
<pre><code>#include &quot;avltree.h&quot;
#include &lt;iostream&gt;

int main()
{
    AVLTree&lt;int&gt; tree;

    for (int i = 0; i &lt; 4; ++i) {
        tree.insert(i);
    }

    for (int elem : tree) {
        std::cout &lt;&lt; elem &lt;&lt; &quot;,&quot;;
    }

    std::cout &lt;&lt; std::endl;

    return 0;
}
</code></pre>
<p>Liefert:</p>
<pre><code>0,3,1,2,
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2477674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477674</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Mon, 30 Nov 2015 16:56:25 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 17:49:01 GMT]]></title><description><![CDATA[<p>Hm, schon das Balancing ist kaputt. Ich habe mal das Parent-Feature deaktiviert.</p>
<pre><code>#ifndef AVLTREE_H
#define AVLTREE_H

#include &lt;memory&gt;
#include &lt;algorithm&gt;
#include &lt;assert.h&gt;
#include &lt;iterator&gt;
#include &lt;iostream&gt;

template &lt;typename T&gt;
class AVLTree
{
private:
  class Node
  {
  public:
    int height = 0;
    T value;

    std::shared_ptr&lt;Node&gt; left = nullptr;
    std::shared_ptr&lt;Node&gt; right = nullptr;
    //std::shared_ptr&lt;Node&gt; parent = nullptr;

    Node(T v)
      : value(v)
    {
    }

    // Kleiner-Ordnung
    bool operator&lt;(const T&amp; _value) const { return value &lt; _value; }
  };

  std::shared_ptr&lt;Node&gt; root = nullptr;

  int getHeight(std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr)
      return -1;
    else
      return p-&gt;height;
  }

  int getBalance(std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr)
      return 0;
    else
      return getHeight(p-&gt;right) - getHeight(p-&gt;left);
  }

  std::shared_ptr&lt;Node&gt; insertR(T value, std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr) {
      p = std::make_shared&lt;Node&gt;(value);
    } else if (value &lt; p-&gt;value) {
      std::shared_ptr&lt;Node&gt; temp = insertR(value, p-&gt;left);
      p-&gt;left = temp;
      //temp-&gt;parent = p;
    } else if (value &gt; p-&gt;value) {
      std::shared_ptr&lt;Node&gt; temp = insertR(value, p-&gt;right);
      p-&gt;right = temp;
      //temp-&gt;parent = p;
    }

    p = balance(p);

    return p;
  }

  std::shared_ptr&lt;Node&gt; balance(std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr)
      return nullptr;

    p-&gt;height = std::max(getHeight(p-&gt;left), getHeight(p-&gt;right)) + 1;

    if (getBalance(p) == -2) {
      if (getBalance(p-&gt;left) &lt;= 0)
        p = rotateRight(p);
      else
        p = rotateLeftRight(p);
    } else if (getBalance(p) == 2) {
      if (getBalance(p-&gt;right) &gt;= 0)
        p = rotateLeft(p);
      else
        p = rotateRightLeft(p);
    }

    return p;
  }

  std::shared_ptr&lt;Node&gt; rotateRight(std::shared_ptr&lt;Node&gt; p)
  {
    assert(p-&gt;left != nullptr);

    std::shared_ptr&lt;Node&gt; q = p-&gt;left;
    p-&gt;left = q-&gt;right;
    q-&gt;right = p;

    p-&gt;height = std::max(getHeight(p-&gt;left), getHeight(p-&gt;right)) + 1;
    q-&gt;height = std::max(getHeight(q-&gt;left), getHeight(q-&gt;right)) + 1;

    //q-&gt;parent = p-&gt;parent;
    //q-&gt;right-&gt;parent = p;
    //p-&gt;parent = q;

    return q;
  }

  void inOrder(std::shared_ptr&lt;Node&gt; p)
  {
      if (p!=nullptr)
      {
          inOrder(p-&gt;left);
          std::cout&lt;&lt; p-&gt;value &lt;&lt;&quot;\t&quot;;
          inOrder(p-&gt;right);
      }
  }

  std::shared_ptr&lt;Node&gt; rotateLeft(std::shared_ptr&lt;Node&gt; p)
  {
    assert(p-&gt;right != nullptr);

    std::shared_ptr&lt;Node&gt; q = p-&gt;right;
    p-&gt;right = q-&gt;left;
    q-&gt;left = p;

    p-&gt;height = std::max(getHeight(p-&gt;left), getHeight(p-&gt;right)) + 1;
    q-&gt;height = std::max(getHeight(q-&gt;left), getHeight(q-&gt;right)) + 1;
/*
    q-&gt;parent = p-&gt;parent;
    q-&gt;left-&gt;parent = p;
    p-&gt;parent = q;*/

    return q;
  }

  std::shared_ptr&lt;Node&gt; rotateLeftRight(std::shared_ptr&lt;Node&gt; p)
  {
    assert(p-&gt;left != nullptr);

    p-&gt;left = rotateLeft(p-&gt;left);
    return rotateRight(p);
  }

  std::shared_ptr&lt;Node&gt; rotateRightLeft(std::shared_ptr&lt;Node&gt; p)
  {
    assert(p-&gt;right != nullptr);

    p-&gt;right = rotateRight(p-&gt;right);
    return rotateLeft(p);
  }

  bool contains(T value, std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr) {
      return false;
    } else {
      if (value &lt; *p) {
        contains(value, p-&gt;left);
      } else {
        if (value &gt; *p) {
          contains(value, p-&gt;right);
        } else {
          return true;
        }
      }
    }
  }

  std::shared_ptr&lt;Node&gt; findMax(std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr) {
      return p;
    } else {
      while (p-&gt;right != nullptr) {
        p = p-&gt;right;
      }
      return p;
    }
  }

  std::shared_ptr&lt;Node&gt; findMin(std::shared_ptr&lt;Node&gt; p)
  {
    if (p == nullptr) {
      return p;
    } else {
      while (p-&gt;left != nullptr) {
        p = p-&gt;left;
      }
      return p;
    }
  }

  class iterator : std::iterator&lt;std::forward_iterator_tag, T&gt;
  {
    AVLTree* tree;
    std::shared_ptr&lt;Node&gt; node;

  private:
    /*std::shared_ptr&lt;Node&gt; inOrderSuccessor(std::shared_ptr&lt;Node&gt; n)
    {
      // step 1 of the above algorithm
      if (n-&gt;right != nullptr)
        return tree-&gt;findMin(n-&gt;right);

      // step 2 of the above algorithm
      std::shared_ptr&lt;Node&gt; p = n-&gt;parent;
      while (p != nullptr &amp;&amp; n == p-&gt;right) {
        n = p;
        p = p-&gt;parent;
      }
      return p;
    }*/

  public:
    explicit iterator()
      : tree(nullptr)
      , node(nullptr)
    {
    }

    explicit iterator(AVLTree* tree)
      : tree(tree)
    {
      node = tree-&gt;findMin(tree-&gt;root);
    }

    T&amp; operator*() { return node-&gt;value; }

    iterator&amp; operator++()
    {
      if (node != nullptr) {
        //node = inOrderSuccessor(node);
      }

      return *this;
    }

    iterator operator++(int)
    {
      iterator tmp = *this;
      ++*this;
      return tmp;
    }

    void printInOrder() {
        tree-&gt;inOrder(tree-&gt;root);
    }

    bool operator==(const iterator&amp; other) const { return node == other.node; }
    bool operator!=(const iterator&amp; other) const { return node != other.node; }
  };

public:
  iterator begin() { return iterator(this); }
  iterator end() { return iterator(); }

  void insert(T value)
  {
    if (root == nullptr) {
      root = std::make_shared&lt;Node&gt;(value);
    } else {
      insertR(value, root);
    }
  }

  bool contains(T value) { return contains(value, root); }

  T findMax() { findMax(root)-&gt;value; }
};

#endif // AVLTREE_H
</code></pre>
<pre><code>#include &quot;avltree.h&quot;
#include &lt;iostream&gt;

int main()
{
    AVLTree&lt;int&gt; tree;

    for (int i = 0; i &lt; 10; ++i) {
        tree.insert(i);
    }

    tree.begin().printInOrder();

/*
    for (int elem : tree) {
        std::cout &lt;&lt; elem &lt;&lt; &quot;,&quot;;
    }*/

    std::cout &lt;&lt; std::endl;

    return 0;
}
</code></pre>
<p>Gibt hier &quot;0 9&quot; aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477683</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Mon, 30 Nov 2015 17:49:01 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 17:51:57 GMT]]></title><description><![CDATA[<p>Hab mich gerade 30 min durch deinen Code geschlagen. Der Fehler (oder wenigstens einer) ist in deiner <code>void insert(T value)</code> Funktion. Dort muss es</p>
<pre><code>root = insertR(value, root);
</code></pre>
<p>heißen, da sich der Wurzelknoten bei einem balance ja auch ändern kann. Mit der kleine Änderung scheint es zu funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477684</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Mon, 30 Nov 2015 17:51:57 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 18:25:19 GMT]]></title><description><![CDATA[<p>Vielen Dank! Du erleichterst mir das Leben!<br />
Vll. fragst du dich, weshalb ich einen eigenen AVL-Baum mache. Das ist eigentlich nicht zu Übungszwecken gedacht, sondern ich brauche einen AVL-Baum der einen 2D-Range-Search kann. D. h., das soll mal ein 2D-AVL-Baum werden, aber erst mal, muss das für 1D funktionieren. Eigentlich will ich damit geometrische Algorithmen implementieren (das ist die eigentliche Übung), aber erst mal brauche ich diesen doofen Baum. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Der Code wird OpenSource sein, auch weil du mir geholfen hast.</p>
<p>Der neueste Stand funktioniert leider nicht mehr, wenn der Baum linkslastig wird. Er gibt dann rekursiv 4,3 aus. Werde wohl weiter brüten.</p>
<pre><code>#include &quot;avltree.h&quot;
#include &lt;iostream&gt;

int main()
{
    AVLTree&lt;int&gt; tree;

    for (int i = 6; i &gt; 0; --i) {
        tree.insert(i);
    }

    for (int elem : tree) {
        std::cout &lt;&lt; elem &lt;&lt; &quot;,&quot;;
    }

    std::cout &lt;&lt; std::endl;

    return 0;
}
</code></pre>
<p>Den neuesten Code findest du hier:</p>
<p><a href="https://github.com/StefanoD/AVLTree" rel="nofollow">https://github.com/StefanoD/AVLTree</a></p>
<p>L. G.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477689</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Mon, 30 Nov 2015 18:25:19 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 18:33:27 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>Hab mich gerade 30 min durch deinen Code geschlagen. Der Fehler (oder wenigstens einer) ist in deiner <code>void insert(T value)</code> Funktion. Dort muss es</p>
<pre><code>root = insertR(value, root);
</code></pre>
<p>heißen, da sich der Wurzelknoten bei einem balance ja auch ändern kann. Mit der kleine Änderung scheint es zu funktionieren.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477693</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 30 Nov 2015 18:33:27 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 18:36:16 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477694</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 30 Nov 2015 18:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 19:17:22 GMT]]></title><description><![CDATA[<p>Der Code scheint jetzt zu funktionieren! Die Parents wurden nicht richtig gesetzt.</p>
<p>Jetzt würde ich den Code ein bisschen auräumen, d. h. von shared_ptr auf unique_ptr umsteigen. Verbesserungsvorschläge sind gerne erwünscht. Wie gesagt: Das ist OpenSource und soll der Allgemeinheit dienen. Im Internet findet man leider kaum AVL-Bäume mit Templates und Iteratoren, geschweigedenn mit Range-Search!</p>
<p>L. G.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477697</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Mon, 30 Nov 2015 19:17:22 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Mon, 30 Nov 2015 19:54:07 GMT]]></title><description><![CDATA[<p>Habe nun auf Raw-Pointer umgestellt, weil der Code mit unique_ptr ganz schön hässlich wurde. Da musste man ein .get() aufrufen, wenn man den unique_ptr an eine Funktion übergeben wollte und man musste einen unique_ptr erstellen und anschließend moven, wenn man eine Zuweisung an einen unique_ptr machen wollte.</p>
<p>Allerdings sagt valgrind:</p>
<pre><code>==10262== 
==10262== HEAP SUMMARY:
==10262==     in use at exit: 91,308 bytes in 7 blocks
==10262==   total heap usage: 1,010 allocs, 1,003 frees, 123,412 bytes allocated
==10262== 
==10262== 4 bytes in 1 blocks are still reachable in loss record 1 of 7
==10262==    at 0x4C2BBCF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10262==    by 0x8CE8F22: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8CE9464: g_private_get (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8CC173C: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8C937ED: g_hash_table_new_full (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8CB470A: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8C75E58: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x40105B9: call_init.part.0 (dl-init.c:72)
==10262==    by 0x40106CA: call_init (dl-init.c:30)
==10262==    by 0x40106CA: _dl_init (dl-init.c:120)
==10262==    by 0x4000D09: ??? (in /lib/x86_64-linux-gnu/ld-2.21.so)
==10262== 
==10262== 32 bytes in 1 blocks are still reachable in loss record 2 of 7
==10262==    at 0x4C2DB95: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10262==    by 0x8CAA5D0: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8C93854: g_hash_table_new_full (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8CB470A: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8C75E58: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x40105B9: call_init.part.0 (dl-init.c:72)
==10262==    by 0x40106CA: call_init (dl-init.c:30)
==10262==    by 0x40106CA: _dl_init (dl-init.c:120)
==10262==    by 0x4000D09: ??? (in /lib/x86_64-linux-gnu/ld-2.21.so)
==10262== 
==10262== 64 bytes in 1 blocks are still reachable in loss record 3 of 7
==10262==    at 0x4C2DB95: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10262==    by 0x8CAA5D0: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8C9383F: g_hash_table_new_full (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8CB470A: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8C75E58: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x40105B9: call_init.part.0 (dl-init.c:72)
==10262==    by 0x40106CA: call_init (dl-init.c:30)
==10262==    by 0x40106CA: _dl_init (dl-init.c:120)
==10262==    by 0x4000D09: ??? (in /lib/x86_64-linux-gnu/ld-2.21.so)
==10262== 
==10262== 88 bytes in 1 blocks are still reachable in loss record 4 of 7
==10262==    at 0x4C2BBCF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10262==    by 0x8CAA578: g_malloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8CC1762: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8C937ED: g_hash_table_new_full (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8CB470A: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8C75E58: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x40105B9: call_init.part.0 (dl-init.c:72)
==10262==    by 0x40106CA: call_init (dl-init.c:30)
==10262==    by 0x40106CA: _dl_init (dl-init.c:120)
==10262==    by 0x4000D09: ??? (in /lib/x86_64-linux-gnu/ld-2.21.so)
==10262== 
==10262== 2,032 bytes in 1 blocks are still reachable in loss record 5 of 7
==10262==    at 0x4C2DB95: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10262==    by 0x8CAA5D0: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8CC19CB: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8C937ED: g_hash_table_new_full (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8CB470A: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8C75E58: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x40105B9: call_init.part.0 (dl-init.c:72)
==10262==    by 0x40106CA: call_init (dl-init.c:30)
==10262==    by 0x40106CA: _dl_init (dl-init.c:120)
==10262==    by 0x4000D09: ??? (in /lib/x86_64-linux-gnu/ld-2.21.so)
==10262== 
==10262== 16,384 bytes in 1 blocks are still reachable in loss record 6 of 7
==10262==    at 0x4C2BBCF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10262==    by 0x8CAA578: g_malloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8CB471B: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x8C75E58: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4600.1)
==10262==    by 0x40105B9: call_init.part.0 (dl-init.c:72)
==10262==    by 0x40106CA: call_init (dl-init.c:30)
==10262==    by 0x40106CA: _dl_init (dl-init.c:120)
==10262==    by 0x4000D09: ??? (in /lib/x86_64-linux-gnu/ld-2.21.so)
==10262== 
==10262== 72,704 bytes in 1 blocks are still reachable in loss record 7 of 7
==10262==    at 0x4C2BBCF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10262==    by 0x58261FF: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==10262==    by 0x40105B9: call_init.part.0 (dl-init.c:72)
==10262==    by 0x40106CA: call_init (dl-init.c:30)
==10262==    by 0x40106CA: _dl_init (dl-init.c:120)
==10262==    by 0x4000D09: ??? (in /lib/x86_64-linux-gnu/ld-2.21.so)
==10262== 
==10262== LEAK SUMMARY:
==10262==    definitely lost: 0 bytes in 0 blocks
==10262==    indirectly lost: 0 bytes in 0 blocks
==10262==      possibly lost: 0 bytes in 0 blocks
==10262==    still reachable: 91,308 bytes in 7 blocks
==10262==         suppressed: 0 bytes in 0 blocks
==10262== 
==10262== For counts of detected and suppressed errors, rerun with: -v
==10262== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
</code></pre>
<p>Also 1,010 allocs und 1,003 frees, heißt es gab Memory-Leaks? So wie es ausschaut jedoch nicht in meinem Code, sondern irgendwo in den System-Libs. Sehe ich das richtig?!</p>
<p>L. G.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477706</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Mon, 30 Nov 2015 19:54:07 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Tue, 01 Dec 2015 13:33:48 GMT]]></title><description><![CDATA[<p>Jemand eine Idee, weshalb ich hier folgenden Fehler kriege?</p>
<pre><code>.../AVLTree/avltree.h:186: Warnung: control may reach end of non-void function [-Wreturn-type]
  }
  ^
</code></pre>
<p>Ich decke eigentlich alle Fälle ab.</p>
<pre><code>bool contains(T value, Node* p)
  {
    if (p == nullptr) {
      return false;
    } else if (value &lt; p-&gt;value) {
      contains(value, p-&gt;left);
    } else if (value &gt; p-&gt;value) {
      contains(value, p-&gt;right);
    } else {
      return true;
    }
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2477810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477810</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Tue, 01 Dec 2015 13:33:48 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Tue, 01 Dec 2015 14:31:04 GMT]]></title><description><![CDATA[<p>AVLTree schrieb:</p>
<blockquote>
<p>Ich decke eigentlich alle Fälle ab.</p>
</blockquote>
<p>Stimmt, aber nicht alle diese Fälle enthalten auch ein return.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477819</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 01 Dec 2015 14:31:04 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Tue, 01 Dec 2015 14:36:42 GMT]]></title><description><![CDATA[<p>Probier' mal</p>
<pre><code>bool contains(T value, Node* p) 
{ 
    if (p == nullptr)
        return false; 

    if (value &lt; p-&gt;value)
        return contains(value, p-&gt;left); 

    if (p-&gt;value &lt; value)
        return contains(value, p-&gt;right); 

    return true; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2477821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477821</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 01 Dec 2015 14:36:42 GMT</pubDate></item><item><title><![CDATA[Reply to AVL-Baum mit Iterator durchiterieren on Tue, 01 Dec 2015 14:42:54 GMT]]></title><description><![CDATA[<p>Ah, verdammt, ich habe zu viel in Scala programmiert! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Das hätte dort wunderbar geklappt! Thx und L. G.!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2477823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2477823</guid><dc:creator><![CDATA[AVLTree]]></dc:creator><pubDate>Tue, 01 Dec 2015 14:42:54 GMT</pubDate></item></channel></rss>