<?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[Vollständig  Binärer Baum (Klasse)]]></title><description><![CDATA[<p>Hallo,</p>
<p>Wir sollen eine Klasse schreiben für VbB.<br />
Folgende Struktur ist vorgegeben:</p>
<p>class knoten<br />
{ f r iend c l a s s VabBaum;<br />
public :<br />
. // Konstruktoren<br />
. // Destruktor<br />
.<br />
pr ivate :<br />
knoteninfo info ;<br />
knoten * lnachf , * rnachf ;<br />
} ;<br />
Vollständig ausgeglichene binäre Bäume:<br />
Die Grundstruktur der Klasse<br />
class VabBaum<br />
{ publ ic :<br />
. // Konstruktoren<br />
. // Destruktor<br />
. // Elementfunktionen, ueberladene Operatoren<br />
.<br />
private :<br />
knoten * wurzel ; // Zeiger auf die Wurzel<br />
unsigned anz ; // Anzahl der Knoten des Baumes<br />
} ;</p>
<p>Nun bin ich eigentlich schon recht weit, das einzige, dass noch probleme bereitet, ist der CopyKonstruktor und der Destruktor !<br />
Ich komme hier einfach nicht weiter und bin schon am verzweifeln -.-<br />
vllt seht ihr das problem :</p>
<pre><code>#include &quot;stdafx.h&quot;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
using namespace std;

using namespace System;

typedef int knoteninfo;

int log2(int n);
int sqr(int n);
int pot2(int n);

class knoten{

	friend class vabbaum;	
	friend void aufbauvoll(knoten *(&amp;) , int n);
	friend void knot(const knoten * p, int t);
	friend ostream &amp; operator&lt;&lt;(ostream &amp;ostr,const knoten &amp;b);
	friend void anhaengen(knoten * (&amp; wurzel), int n,const knoteninfo inf);
	friend knoten * suchen(knoten *p,const knoteninfo inf);
	friend bool loeschen(const vabbaum &amp;b,const knoteninfo inf);
	friend knoten * letztknot(knoten * wurzel, int n);

public :
	knoten(){
		lnachf=NULL;
		rnachf=NULL;
		info = 0;
	}

	knoten(knoteninfo inf){
		lnachf=NULL;
		rnachf=NULL;
		info = inf ;
	}

	~knoten(){
		lnachf=NULL;
		rnachf=NULL;
		info = 0;		
	}

private :

	knoteninfo info ;
	knoten * lnachf , * rnachf ;
} ;

ostream &amp; operator&lt;&lt;(ostream &amp;ostr,const knoten &amp;b){

	ostr&lt;&lt;&quot;Knoteninfo : &quot;&lt;&lt;/*b.info&lt;&lt;*/endl;
	return ostr;
}

class vabbaum
{ 
	friend void baumaus(const vabbaum vb);    
	friend bool isempty(const vabbaum &amp;M);
	friend ostream&amp; operator &lt;&lt;( ostream&amp;,const vabbaum &amp;) ;
	friend istream&amp; operator &gt;&gt;( istream&amp;, vabbaum &amp;) ;
	friend void insert(vabbaum &amp; vb, const knoteninfo inf);
	friend bool loeschen(const vabbaum &amp;b,const knoteninfo inf);
	friend knoten * lastnode(vabbaum vb);

public :
vabbaum(): wurzel(NULL) , anz(0) {};

vabbaum(unsigned int n){
	aufbauvoll(wurzel,n);
	anz = n;
}

vabbaum(const vabbaum &amp;b){

	if(b.anz == 0) {
		wurzel = 0;
		anz=0;
	}

	else{

		anz = b.anz;
		wurzel = new knoten(b.wurzel-&gt;info);
		kopieren(wurzel-&gt;rnachf,b.wurzel-&gt;rnachf);
		kopieren(wurzel-&gt;lnachf,b.wurzel-&gt;lnachf);
	}

}

vabbaum operator+(const knoteninfo inf){

	vabbaum z(*this);
	insert(z,inf);
	return z;    

}

vabbaum operator+=(const knoteninfo inf){

	insert(*this,inf);
	return *this;

}

vabbaum operator-(const knoteninfo inf){

	vabbaum z(*this);
	loeschen (z,inf);

	return z;

}

vabbaum operator -=(const knoteninfo inf){

	if(loeschen(*this,inf)) anz--;

	return *this;

}

void operator--(){

	if(anz != 0){
	knot(wurzel-&gt;lnachf,0);
	cout&lt;&lt;endl&lt;&lt;endl&lt;&lt;endl;
	}
}

void operator++(){

	if(anz != 0){
	knot(wurzel-&gt;rnachf,0);
	cout&lt;&lt;endl&lt;&lt;endl&lt;&lt;endl;
	}
}

//
//~vabbaum(){
//    destroy(wurzel);
//} 

private :
knoten * wurzel ; // Zeiger auf die Wurzel
unsigned anz ; // Anzahl der Knoten des Baumes

static void kopieren(knoten *a,const knoten *b){

	while(b != NULL)
	{

		a = new knoten(b-&gt;info);		
		kopieren(a-&gt;rnachf,b-&gt;rnachf);		
		kopieren(a-&gt;lnachf,b-&gt;lnachf);
	}

}

//static void destroy(knoten *node){   
//	
//	if(node){        
//		destroy(node-&gt;lnachf);
//        destroy(node-&gt;rnachf);
//        delete node;    
//	}
//} h
} ;

ostream &amp; operator&lt;&lt;(ostream &amp;ostr,const vabbaum &amp;b){

	ostr&lt;&lt;&quot;Anzahl der Knoten : &quot;&lt;&lt;b.anz&lt;&lt;endl;
	ostr&lt;&lt;&quot;Ausgabe des Baumes &quot;&lt;&lt;endl;
	if(!isempty(b)) ostr&lt;&lt;&quot;Baum ist leer&quot;&lt;&lt;endl;
	ostr&lt;&lt;endl&lt;&lt;endl&lt;&lt;endl;
	baumaus(b);
	ostr&lt;&lt;endl&lt;&lt;endl&lt;&lt;endl;
    return ostr;

}

istream&amp; operator &gt;&gt;( istream&amp; istr, vabbaum &amp;b) {

	 unsigned int n;

     cout&lt;&lt;&quot;Bitte Knotenanzahl eingeben &quot;&lt;&lt;endl&lt;&lt;endl;
	 cin&gt;&gt;n;
	 if(n&gt;0){

		 cout&lt;&lt;&quot;Bitte Knoteninfos eingeben &quot;&lt;&lt;endl;     
		 aufbauvoll(b.wurzel,n);
	 }

	 b.anz = n;
     return istr;
 }

int main(array&lt;System::String ^&gt; ^args)
{

	int n;	
	vabbaum x,z;
    cin&gt;&gt;x;	
/*	vabbaum y(x);
    cout&lt;&lt;y;
	y-=10;
	cout&lt;&lt;y;*/
	cout&lt;&lt;x;
	--x;
	++x;
	cin&gt;&gt;n;

    return 0;
}

bool isempty(const vabbaum &amp;B){

	return B.anz;
}

void baumaus(const vabbaum vb)
//   =======                                   //
// Ausgabe des Baumes &quot;vb&quot; in seiner Struktur. //
{ knot(vb.wurzel,0);
 } // &lt;--- Ende baumaus //
void knot(const knoten * p, int t)
//   ====                                           //
// Ausgabe des Baumes, Hilfsroutine fuer &quot;baumaus&quot;. //
{ int i;
  if (p != NULL)
   { knot(p-&gt;rnachf,t+1);
     for (i=1; i &lt;= t; i++) cerr &lt;&lt; &quot;   &quot;;
     cerr &lt;&lt; p-&gt;info &lt;&lt; &quot;\n&quot;;
     knot(p-&gt;lnachf,t+1);
    }
 } // &lt;--- Ende knot

void aufbauvoll(knoten * (&amp; p), int n)
//   ==========                           //
// n - Anzahl der Knoten                  //
// Baut die Struktur eines vollstaendigen //
// Baumes aus n Knoten auf                //

{ 
knoteninfo u;
if(n!=0){
	cin&gt;&gt;u;
}
if (n &gt; 3)
   { p = new knoten;
     p-&gt;lnachf = p-&gt;rnachf = NULL;	 
     p-&gt;info = u;
     int k = log2(n+1), nst = pot2(k)-1, rest = n - nst;
     if (rest==0)
      { n = (n-1)/2;
        aufbauvoll(p-&gt;lnachf,n);
        aufbauvoll(p-&gt;rnachf,n);
       }
     else if (rest &lt;= ((nst+1)/2))
           { int nr = (nst-1)/2, nl = nr + rest;
             aufbauvoll(p-&gt;lnachf,nl);
             aufbauvoll(p-&gt;rnachf,nr);
            }
     else
      {//nl = (nst-1)/2 + (nst+1)/2 = nst, nr = rest-1//
            aufbauvoll(p-&gt;lnachf,nst);
            aufbauvoll(p-&gt;rnachf,rest-1);
       }
    }
   else if (n==3)
    {
     p = new knoten;
     p-&gt;info = u;
     p-&gt;lnachf = new knoten;
     p-&gt;lnachf-&gt;lnachf = p-&gt;lnachf-&gt;rnachf = NULL;
	 cin&gt;&gt;u;
     p-&gt;lnachf-&gt;info = u;
     p-&gt;rnachf = new knoten;
     p-&gt;rnachf-&gt;lnachf = p-&gt;rnachf-&gt;rnachf = NULL;
	 cin&gt;&gt;u;
     p-&gt;rnachf-&gt;info = u;
     }
   else if (n==2)
    {
     p = new knoten;
     p-&gt;info = u;
     p-&gt;lnachf = new knoten;
     p-&gt;lnachf-&gt;lnachf = p-&gt;lnachf-&gt;rnachf = NULL;
	 cin&gt;&gt;u;
     p-&gt;lnachf-&gt;info = u;
     p-&gt;rnachf = NULL;
     }
   else if (n==1)
    {
     p = new knoten;
     p-&gt;info = u;
     p-&gt;lnachf = p-&gt;rnachf = NULL;
     }
   else if (n==0)
    {
     p = NULL;
     }
 } // &lt;--- Ende aufbauvoll //

int log2(int n)
//  ====                                //
// ganzzahliger Zweierlogarithmus von n //
// °($(n\geqslant 1),\quad k = \lfloor\log_2(n)\rfloor$)°                   //
{ if (n == 1) return 0;
  else return (log2(n/2) + 1);
 } // &lt;--- Ende log2 //

int sqr(int n)
//  ===                                 //
// Quadrat einer natuerlichen Zahl      //
{ return n*n;
 } // &lt;--- Ende sqr //

int pot2(int n)
//  ====                               //
// Zweierpotenz von n: °($2^n,\quad (n \geqslant 0)$)°       //
// &quot;schnelles Potenzieren&quot;, binaer     //
{ if (n == 0) return 1;
   else if (n%2)
         return sqr(pot2(n/2))*2;
   else  return sqr(pot2(n/2));
 } // &lt;--- Ende pot2 //

void insert(vabbaum &amp; vb, const knoteninfo inf)
//   ======                                        //
// Mit Hilfe von &quot;anhaengen&quot; wird ein neuer Knoten //
// mit Info &quot;inf&quot; in den Baum &quot;vb&quot; eingefuegt.     //
{ anhaengen(vb.wurzel,vb.anz,inf);
  vb.anz++;
 } // &lt;--- Ende insert //
void anhaengen(knoten * (&amp; wurzel), int n, 
               const knoteninfo inf)
//   =========                                     //
// In einen vollstaendigen Baum wird der letzte    //
// Knoten so ergaenzt, dass der Baum vollstaendig  //
// mit HEAP-Eigenschaft bleibt.                    //
{ int nst, rest, k;
  if (n&gt;2)
   { k = log2(n+1); nst = pot2(k)-1; rest = n - nst;
     if (rest==0)
      { n = (n-1)/2;
        anhaengen(wurzel-&gt;lnachf,n,inf);
       }
     else if ((rest+1)&lt;=((nst+1)/2))
           { n = (nst-1)/2 + rest;
             anhaengen(wurzel-&gt;lnachf,n,inf);
            }
     else    //=n-(nst+1)=(nst-1)/2+rest-pot2(k-1);//
      { n = rest - 1;
        anhaengen(wurzel-&gt;rnachf,n,inf);
       }
    }
  else if (n==2)
    { wurzel-&gt;rnachf = new knoten;      
      wurzel-&gt;rnachf-&gt;lnachf = NULL;
      wurzel-&gt;rnachf-&gt;rnachf = NULL;

     }
  else if (n==1)
    { wurzel-&gt;lnachf = new knoten;      
      wurzel-&gt;lnachf-&gt;lnachf = NULL;
      wurzel-&gt;lnachf-&gt;rnachf = NULL;

     }
  else // n==0 !
   { wurzel = new knoten;
     wurzel-&gt;info = inf;     
     wurzel-&gt;lnachf = wurzel-&gt;rnachf = NULL;
    }
 } // &lt;--- Ende anhaengen //

bool loeschen(const vabbaum &amp;b,const knoteninfo inf){

	knoten *p,*m;
	p = suchen(b.wurzel,inf);
	if(p != NULL) {
		m = lastnode(b);
		p-&gt;info = m-&gt;info;
		delete m;
		return true;
	}
return false;

}

knoten * suchen(knoten *p,const knoteninfo inf){

	while(p != NULL){

		if(p-&gt;info = inf) return p;
		else{
			suchen(p-&gt;rnachf,inf);
			suchen(p-&gt;lnachf,inf);

		}
	}
return NULL;
}

knoten * lastnode(vabbaum vb)
//       ========                                      //
// Suche letzten Knoten in einem vollstaendigen        //
// Baum &quot;vb&quot;.                                          //
// Funktion stuetzt sich auf &quot;letztknot&quot; --&gt; Rekursion!//
{ return letztknot(vb.wurzel,vb.anz);
 } // &lt;--- Ende lastnode //

knoten * letztknot(knoten * wurzel, int n)
//       =========                                   //
// Suche letzten Knoten in einem vollstaendigen Baum //
// mit n Knoten.                                     //
{ int nst, k, rest;
  if (n&gt;1) // °($k = \lfloor\log_2(n+1)\rfloor,\quad n'=2^k-1,\quad r=n-n'$)° 
   { k = log2(n+1); nst = pot2(k)-1; rest = n - nst;
     if (rest==0)
      { n = (n-1)/2;
        return letztknot(wurzel-&gt;rnachf,n);
       }
     else if (rest &lt;= ((nst+1)/2))
           { n = (nst-1)/2 + rest;
             return letztknot(wurzel-&gt;lnachf,n);
            }
     else      //n=n-(nst+1)=(nst-1)/2+rest-pot2(k-1)//
       { n = rest - 1;
         return letztknot(wurzel-&gt;rnachf,n);
        }
    }
  else if (n==1) return wurzel;
  else return NULL;
 } // &lt;--- Ende letztknot
</code></pre>
<p>Die Kommentare im Code sind nicht immer aktuell !</p>
<p>Die relevanten Sachen wäre hier :</p>
<p>Aufbau des Baumes,<br />
Konstruktor,<br />
Destruktor</p>
<p>Da ich vieles auf den Konstruktor aufbauen möchte, is der Kram für den weiteren Verlauf sehr wichtig.<br />
Der Standardkonstruktor von Visual Studios kopiert leider komplett alles und raus kommt quasi einfach nur eine Referenz auf den Ausgangsbaum !<br />
Dies bringt mir aber nicht viel, da der Ursprungsbaum nicht verändert werden soll, wenn ich den kopierten verändere, sprich, die müssen beide eigenständig sein und nicht die gleichen Speicherplätze beschreiben.</p>
<p>Habt vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/278330/vollständig-binärer-baum-klasse</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 09:22:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/278330.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 04 Dec 2010 17:56:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vollständig  Binärer Baum (Klasse) on Sat, 04 Dec 2010 17:59:22 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Wir sollen eine Klasse schreiben für VbB.<br />
Folgende Struktur ist vorgegeben:</p>
<p>class knoten<br />
{ f r iend c l a s s VabBaum;<br />
public :<br />
. // Konstruktoren<br />
. // Destruktor<br />
.<br />
pr ivate :<br />
knoteninfo info ;<br />
knoten * lnachf , * rnachf ;<br />
} ;<br />
Vollständig ausgeglichene binäre Bäume:<br />
Die Grundstruktur der Klasse<br />
class VabBaum<br />
{ publ ic :<br />
. // Konstruktoren<br />
. // Destruktor<br />
. // Elementfunktionen, ueberladene Operatoren<br />
.<br />
private :<br />
knoten * wurzel ; // Zeiger auf die Wurzel<br />
unsigned anz ; // Anzahl der Knoten des Baumes<br />
} ;</p>
<p>Nun bin ich eigentlich schon recht weit, das einzige, dass noch probleme bereitet, ist der CopyKonstruktor und der Destruktor !<br />
Ich komme hier einfach nicht weiter und bin schon am verzweifeln -.-<br />
vllt seht ihr das problem :</p>
<pre><code>#include &quot;stdafx.h&quot;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
using namespace std;

using namespace System;

typedef int knoteninfo;

int log2(int n);
int sqr(int n);
int pot2(int n);

class knoten{

	friend class vabbaum;	
	friend void aufbauvoll(knoten *(&amp;) , int n);
	friend void knot(const knoten * p, int t);
	friend ostream &amp; operator&lt;&lt;(ostream &amp;ostr,const knoten &amp;b);
	friend void anhaengen(knoten * (&amp; wurzel), int n,const knoteninfo inf);
	friend knoten * suchen(knoten *p,const knoteninfo inf);
	friend bool loeschen(const vabbaum &amp;b,const knoteninfo inf);
	friend knoten * letztknot(knoten * wurzel, int n);

public :
	knoten(){
		lnachf=NULL;
		rnachf=NULL;
		info = 0;
	}

	knoten(knoteninfo inf){
		lnachf=NULL;
		rnachf=NULL;
		info = inf ;
	}

	~knoten(){
		lnachf=NULL;
		rnachf=NULL;
		info = 0;		
	}

private :

	knoteninfo info ;
	knoten * lnachf , * rnachf ;
} ;

ostream &amp; operator&lt;&lt;(ostream &amp;ostr,const knoten &amp;b){

	ostr&lt;&lt;&quot;Knoteninfo : &quot;&lt;&lt;/*b.info&lt;&lt;*/endl;
	return ostr;
}

class vabbaum
{ 
	friend void baumaus(const vabbaum vb);    
	friend bool isempty(const vabbaum &amp;M);
	friend ostream&amp; operator &lt;&lt;( ostream&amp;,const vabbaum &amp;) ;
	friend istream&amp; operator &gt;&gt;( istream&amp;, vabbaum &amp;) ;
	friend void insert(vabbaum &amp; vb, const knoteninfo inf);
	friend bool loeschen(const vabbaum &amp;b,const knoteninfo inf);
	friend knoten * lastnode(vabbaum vb);

public :
vabbaum(): wurzel(NULL) , anz(0) {};

vabbaum(unsigned int n){
	aufbauvoll(wurzel,n);
	anz = n;
}

vabbaum(const vabbaum &amp;b){

	if(b.anz == 0) {
		wurzel = 0;
		anz=0;
	}

	else{

		anz = b.anz;
		wurzel = new knoten(b.wurzel-&gt;info);
		kopieren(wurzel-&gt;rnachf,b.wurzel-&gt;rnachf);
		kopieren(wurzel-&gt;lnachf,b.wurzel-&gt;lnachf);
	}

}

vabbaum operator+(const knoteninfo inf){

	vabbaum z(*this);
	insert(z,inf);
	return z;    

}

vabbaum operator+=(const knoteninfo inf){

	insert(*this,inf);
	return *this;

}

vabbaum operator-(const knoteninfo inf){

	vabbaum z(*this);
	loeschen (z,inf);

	return z;

}

vabbaum operator -=(const knoteninfo inf){

	if(loeschen(*this,inf)) anz--;

	return *this;

}

void operator--(){

	if(anz != 0){
	knot(wurzel-&gt;lnachf,0);
	cout&lt;&lt;endl&lt;&lt;endl&lt;&lt;endl;
	}
}

void operator++(){

	if(anz != 0){
	knot(wurzel-&gt;rnachf,0);
	cout&lt;&lt;endl&lt;&lt;endl&lt;&lt;endl;
	}
}

//
//~vabbaum(){
//    destroy(wurzel);
//} 

private :
knoten * wurzel ; // Zeiger auf die Wurzel
unsigned anz ; // Anzahl der Knoten des Baumes

static void kopieren(knoten *a,const knoten *b){

	while(b != NULL)
	{

		a = new knoten(b-&gt;info);		
		kopieren(a-&gt;rnachf,b-&gt;rnachf);		
		kopieren(a-&gt;lnachf,b-&gt;lnachf);
	}

}

//static void destroy(knoten *node){   
//	
//	if(node){        
//		destroy(node-&gt;lnachf);
//        destroy(node-&gt;rnachf);
//        delete node;    
//	}
//} h
} ;

ostream &amp; operator&lt;&lt;(ostream &amp;ostr,const vabbaum &amp;b){

	ostr&lt;&lt;&quot;Anzahl der Knoten : &quot;&lt;&lt;b.anz&lt;&lt;endl;
	ostr&lt;&lt;&quot;Ausgabe des Baumes &quot;&lt;&lt;endl;
	if(!isempty(b)) ostr&lt;&lt;&quot;Baum ist leer&quot;&lt;&lt;endl;
	ostr&lt;&lt;endl&lt;&lt;endl&lt;&lt;endl;
	baumaus(b);
	ostr&lt;&lt;endl&lt;&lt;endl&lt;&lt;endl;
    return ostr;

}

istream&amp; operator &gt;&gt;( istream&amp; istr, vabbaum &amp;b) {

	 unsigned int n;

     cout&lt;&lt;&quot;Bitte Knotenanzahl eingeben &quot;&lt;&lt;endl&lt;&lt;endl;
	 cin&gt;&gt;n;
	 if(n&gt;0){

		 cout&lt;&lt;&quot;Bitte Knoteninfos eingeben &quot;&lt;&lt;endl;     
		 aufbauvoll(b.wurzel,n);
	 }

	 b.anz = n;
     return istr;
 }

int main(array&lt;System::String ^&gt; ^args)
{

	int n;	
	vabbaum x,z;
    cin&gt;&gt;x;	
/*	vabbaum y(x);
    cout&lt;&lt;y;
	y-=10;
	cout&lt;&lt;y;*/
	cout&lt;&lt;x;
	--x;
	++x;
	cin&gt;&gt;n;

    return 0;
}

bool isempty(const vabbaum &amp;B){

	return B.anz;
}

void baumaus(const vabbaum vb)
//   =======                                   //
// Ausgabe des Baumes &quot;vb&quot; in seiner Struktur. //
{ knot(vb.wurzel,0);
 } // &lt;--- Ende baumaus //
void knot(const knoten * p, int t)
//   ====                                           //
// Ausgabe des Baumes, Hilfsroutine fuer &quot;baumaus&quot;. //
{ int i;
  if (p != NULL)
   { knot(p-&gt;rnachf,t+1);
     for (i=1; i &lt;= t; i++) cerr &lt;&lt; &quot;   &quot;;
     cerr &lt;&lt; p-&gt;info &lt;&lt; &quot;\n&quot;;
     knot(p-&gt;lnachf,t+1);
    }
 } // &lt;--- Ende knot

void aufbauvoll(knoten * (&amp; p), int n)
//   ==========                           //
// n - Anzahl der Knoten                  //
// Baut die Struktur eines vollstaendigen //
// Baumes aus n Knoten auf                //

{ 
knoteninfo u;
if(n!=0){
	cin&gt;&gt;u;
}
if (n &gt; 3)
   { p = new knoten;
     p-&gt;lnachf = p-&gt;rnachf = NULL;	 
     p-&gt;info = u;
     int k = log2(n+1), nst = pot2(k)-1, rest = n - nst;
     if (rest==0)
      { n = (n-1)/2;
        aufbauvoll(p-&gt;lnachf,n);
        aufbauvoll(p-&gt;rnachf,n);
       }
     else if (rest &lt;= ((nst+1)/2))
           { int nr = (nst-1)/2, nl = nr + rest;
             aufbauvoll(p-&gt;lnachf,nl);
             aufbauvoll(p-&gt;rnachf,nr);
            }
     else
      {//nl = (nst-1)/2 + (nst+1)/2 = nst, nr = rest-1//
            aufbauvoll(p-&gt;lnachf,nst);
            aufbauvoll(p-&gt;rnachf,rest-1);
       }
    }
   else if (n==3)
    {
     p = new knoten;
     p-&gt;info = u;
     p-&gt;lnachf = new knoten;
     p-&gt;lnachf-&gt;lnachf = p-&gt;lnachf-&gt;rnachf = NULL;
	 cin&gt;&gt;u;
     p-&gt;lnachf-&gt;info = u;
     p-&gt;rnachf = new knoten;
     p-&gt;rnachf-&gt;lnachf = p-&gt;rnachf-&gt;rnachf = NULL;
	 cin&gt;&gt;u;
     p-&gt;rnachf-&gt;info = u;
     }
   else if (n==2)
    {
     p = new knoten;
     p-&gt;info = u;
     p-&gt;lnachf = new knoten;
     p-&gt;lnachf-&gt;lnachf = p-&gt;lnachf-&gt;rnachf = NULL;
	 cin&gt;&gt;u;
     p-&gt;lnachf-&gt;info = u;
     p-&gt;rnachf = NULL;
     }
   else if (n==1)
    {
     p = new knoten;
     p-&gt;info = u;
     p-&gt;lnachf = p-&gt;rnachf = NULL;
     }
   else if (n==0)
    {
     p = NULL;
     }
 } // &lt;--- Ende aufbauvoll //

int log2(int n)
//  ====                                //
// ganzzahliger Zweierlogarithmus von n //
// °($(n\geqslant 1),\quad k = \lfloor\log_2(n)\rfloor$)°                   //
{ if (n == 1) return 0;
  else return (log2(n/2) + 1);
 } // &lt;--- Ende log2 //

int sqr(int n)
//  ===                                 //
// Quadrat einer natuerlichen Zahl      //
{ return n*n;
 } // &lt;--- Ende sqr //

int pot2(int n)
//  ====                               //
// Zweierpotenz von n: °($2^n,\quad (n \geqslant 0)$)°       //
// &quot;schnelles Potenzieren&quot;, binaer     //
{ if (n == 0) return 1;
   else if (n%2)
         return sqr(pot2(n/2))*2;
   else  return sqr(pot2(n/2));
 } // &lt;--- Ende pot2 //

void insert(vabbaum &amp; vb, const knoteninfo inf)
//   ======                                        //
// Mit Hilfe von &quot;anhaengen&quot; wird ein neuer Knoten //
// mit Info &quot;inf&quot; in den Baum &quot;vb&quot; eingefuegt.     //
{ anhaengen(vb.wurzel,vb.anz,inf);
  vb.anz++;
 } // &lt;--- Ende insert //
void anhaengen(knoten * (&amp; wurzel), int n, 
               const knoteninfo inf)
//   =========                                     //
// In einen vollstaendigen Baum wird der letzte    //
// Knoten so ergaenzt, dass der Baum vollstaendig  //
// mit HEAP-Eigenschaft bleibt.                    //
{ int nst, rest, k;
  if (n&gt;2)
   { k = log2(n+1); nst = pot2(k)-1; rest = n - nst;
     if (rest==0)
      { n = (n-1)/2;
        anhaengen(wurzel-&gt;lnachf,n,inf);
       }
     else if ((rest+1)&lt;=((nst+1)/2))
           { n = (nst-1)/2 + rest;
             anhaengen(wurzel-&gt;lnachf,n,inf);
            }
     else    //=n-(nst+1)=(nst-1)/2+rest-pot2(k-1);//
      { n = rest - 1;
        anhaengen(wurzel-&gt;rnachf,n,inf);
       }
    }
  else if (n==2)
    { wurzel-&gt;rnachf = new knoten;      
      wurzel-&gt;rnachf-&gt;lnachf = NULL;
      wurzel-&gt;rnachf-&gt;rnachf = NULL;

     }
  else if (n==1)
    { wurzel-&gt;lnachf = new knoten;      
      wurzel-&gt;lnachf-&gt;lnachf = NULL;
      wurzel-&gt;lnachf-&gt;rnachf = NULL;

     }
  else // n==0 !
   { wurzel = new knoten;
     wurzel-&gt;info = inf;     
     wurzel-&gt;lnachf = wurzel-&gt;rnachf = NULL;
    }
 } // &lt;--- Ende anhaengen //

bool loeschen(const vabbaum &amp;b,const knoteninfo inf){

	knoten *p,*m;
	p = suchen(b.wurzel,inf);
	if(p != NULL) {
		m = lastnode(b);
		p-&gt;info = m-&gt;info;
		delete m;
		return true;
	}
return false;

}

knoten * suchen(knoten *p,const knoteninfo inf){

	while(p != NULL){

		if(p-&gt;info = inf) return p;
		else{
			suchen(p-&gt;rnachf,inf);
			suchen(p-&gt;lnachf,inf);

		}
	}
return NULL;
}

knoten * lastnode(vabbaum vb)
//       ========                                      //
// Suche letzten Knoten in einem vollstaendigen        //
// Baum &quot;vb&quot;.                                          //
// Funktion stuetzt sich auf &quot;letztknot&quot; --&gt; Rekursion!//
{ return letztknot(vb.wurzel,vb.anz);
 } // &lt;--- Ende lastnode //

knoten * letztknot(knoten * wurzel, int n)
//       =========                                   //
// Suche letzten Knoten in einem vollstaendigen Baum //
// mit n Knoten.                                     //
{ int nst, k, rest;
  if (n&gt;1) // °($k = \lfloor\log_2(n+1)\rfloor,\quad n'=2^k-1,\quad r=n-n'$)° 
   { k = log2(n+1); nst = pot2(k)-1; rest = n - nst;
     if (rest==0)
      { n = (n-1)/2;
        return letztknot(wurzel-&gt;rnachf,n);
       }
     else if (rest &lt;= ((nst+1)/2))
           { n = (nst-1)/2 + rest;
             return letztknot(wurzel-&gt;lnachf,n);
            }
     else      //n=n-(nst+1)=(nst-1)/2+rest-pot2(k-1)//
       { n = rest - 1;
         return letztknot(wurzel-&gt;rnachf,n);
        }
    }
  else if (n==1) return wurzel;
  else return NULL;
 } // &lt;--- Ende letztknot
</code></pre>
<p>Die Kommentare im Code sind nicht immer aktuell !</p>
<p>Die relevanten Sachen wäre hier :</p>
<p>Aufbau des Baumes,<br />
Konstruktor,<br />
Destruktor</p>
<p>Da ich vieles auf den Konstruktor aufbauen möchte, is der Kram für den weiteren Verlauf sehr wichtig.<br />
Der Standardkonstruktor von Visual Studios kopiert leider komplett alles und raus kommt quasi einfach nur eine Referenz auf den Ausgangsbaum !<br />
Dies bringt mir aber nicht viel, da der Ursprungsbaum nicht verändert werden soll, wenn ich den kopierten verändere, sprich, die müssen beide eigenständig sein und nicht die gleichen Speicherplätze beschreiben.</p>
<p>Habt vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1989820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1989820</guid><dc:creator><![CDATA[ponchosi]]></dc:creator><pubDate>Sat, 04 Dec 2010 17:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständig  Binärer Baum (Klasse) on Sun, 05 Dec 2010 10:42:57 GMT]]></title><description><![CDATA[<p>Hast du zu 450 Zeilen Code auch etwas konkreteres als Frage zu liefern als &quot;Hilfe, ich komme nicht weiter!&quot;? So wird sich das niemand durchlesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1989968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1989968</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 05 Dec 2010 10:42:57 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständig  Binärer Baum (Klasse) on Sun, 05 Dec 2010 14:36:51 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie schon geschrieben, es geht nur um den Kopier und Destruktor !<br />
Alles andere, das nicht mit diesen beiden Funktionen zusammenhängt, läuft soweit !<br />
Habe nur den ganzen Code gepostet, weil ich nicht genau weiß, wo der Fehler liegt ! Afaik kann es aber nur am Konstruktor, Destruktor oder am Aufbau liegen !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1990094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1990094</guid><dc:creator><![CDATA[ponchosi]]></dc:creator><pubDate>Sun, 05 Dec 2010 14:36:51 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständig  Binärer Baum (Klasse) on Sun, 05 Dec 2010 15:12:12 GMT]]></title><description><![CDATA[<p>Poste nur den zur Problemlösung relevanten Code und stelle eine konkrete Frage. &quot;Es geht um den CopyCtor ist KEINE klare Frage&quot;.<br />
Niemand wird sich 450 Zeilen Code durchlesen.</p>
<p>Dein Code ist übrigens extrem grenzwertig. Wieso benutzt du freie Funktionen und nicht Methoden? Da kannst du auch gleich in C programmieren...</p>
<p>Und vor Satzzeichen macht man übrigens keine Leerzeichen;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1990102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1990102</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Sun, 05 Dec 2010 15:12:12 GMT</pubDate></item></channel></rss>