.


:




:

































 

 

 

 





:

1) , . . ( ) . . , :

struct Data

{

int a;

};

2) , :

struct Tree

{

Data d;

Tree *left;

Tree *right;

};

:

left ;

right .

( main() ).

( main()) :

Tree *u = 0;

, 0.

, . .

. : 10, 25, 20, 6, 21, 8, 1, 30. . .

. 10. . 25. , 25 . 20 10, 25, , 25. . , :

 


. u .

1. :

void Add(Tree **u, Data &x)

{

Tree *p = *u;

if(p == 0)

{ // -

p = new Tree;

p->d.a = x.a;

p->left = 0;

p->right = 0;

*u = p;

return;

}

Tree *p1;

bool priznak = false; // ,

while(p &&!priznak)

{

p1 = p;

if(x.a == p->d.a)

priznak = true;

else

if(x.a < p->d.a)

p = p->left;

else

p = p->right;

}

if(priznak) return;

 

//

Tree *pnew = new Tree;

pnew->d.a = x.a;

pnew->left = 0;

pnew->right = 0;

if(x.a < p1->d.a) //

p1->left = pnew;

else //

p1->right = pnew;

}

:

Add(&u, x);

x Data.

. x ( ).

2. ( ) :

void Print(Tree *u)

{

if(u)

{

Print(u->left);

cout << u->d.a << endl;

Print(u->right);

}

}

:

Print(u);

3. , :

Tree* Find(Tree *u, Data &x, Tree **prev)

{

Tree *p = u;

*prev = 0;

 

// -

if(p == 0)

return 0;

 

//

while(p)

{

//cout << "Find: " << p->d.a << endl;

if(p->d.a == x.a) //

return p;

if(p->d.a > x.a) //

{

*prev = p;

p = p->left;

}

else//

{

*prev = p;

p = p->right;

}

}

 

// -

*prev = 0;

return 0;

}

:

Tree *p = Find(u, x, &p0);

( , 0).

- p0 . , p0=0. x, Data.

4. :

void Delete(Tree **u, Data &x)

{

Tree *p0 = 0;

Tree *p = Find(*u, x, &p0);

 

// -

if(p == 0)

return;

 

// -

if(p0 == 0 && (p->left == 0 || p->right == 0))

{

if(p->left == 0 && p->right == 0)

*u = 0;

else if(p->left == 0)

*u = p->right;

else

*u = p->left;

delete p;

return;

}

 

// -

if(p->left == 0 && p->right == 0)

{

if(p0)

{

if(p0->left == p)

p0->left = 0;

else

p0->right = 0;

}

else// !

u = 0;

delete p;

return;

}

 

// - ,

if(p->left!= 0 && p->right == 0)

{

if(p0->left == p)

p0->left = p->left;

else

p0->right = p->left;

delete p;

return;

}

 

// - ,

if(p->left == 0 && p->right!= 0)

{

if(p0->left == p)

p0->left = p->right;

else

p0->right = p->right;

delete p;

return;

}

 

//

if(p->left!= 0 && p->right!= 0)

{

p0 = p;

Tree *t = p->left;

while(t->right)

{

p0 = t;

t = t->right;

}

p->d.a = t->d.a;

if(p0->left == t)

p0->left = 0;

else

p0->right = 0;

delete t;

}

}

:

Delete(&u, x);

x Data.

Delete() Find() . Delete() Find() p0 , .

5. ()

, , . , . :

//

void Clear(Tree **u)

{

if(*u == 0) return;

Clear1(u);

cout << "delete (*u)->d.a=" << (*u)->d.a << endl;

delete *u;

*u=0;

}

void Clear1(Tree **u0)

{

Tree *t;

Tree *u = *u0;

if(u->left!= 0)

{

if(u->left->left!= 0 || u->left->right!= 0)

Clear1(&(u->left));

if(u->left->left == 0 && u->left->right == 0)

{

cout << "delete u->left->d.a=" << u->left->d.a << endl;

t = u->left;

delete t;

u->left = 0;

}

}

if(u->right!= 0)

{

if(u->right->left!= 0 || u->right->right!= 0)

Clear1(&(u->right));

if(u->right->left == 0 && u->right->right == 0)

{

cout << "delete u->right->d.a=" << u->right->d.a << endl;

t = u->right;

delete t;

u->right = 0;

}

}

}

:

Clear(&u);

Clear() Clear1(), , . Clear().

Clear() - . Clear1() .

, Clear1() : u->left? , , , . u->left , , , .. Clear1() . u->right. , , Clear().

Clear() Clear1() . : 10, 25, 20, 6, 21, 8, 1, 30, :

delete u->left->d.a=1

delete u->right->d.a=8

delete u->left->d.a=6

delete u->right->d.a=21

delete u->left->d.a=20

delete u->right->d.a=30

delete u->right->d.a=25

delete (*u)->d.a=10

.





:


: 2016-09-06; !; : 529 |


:

:

: , .
==> ...

1833 - | 1438 -


© 2015-2024 lektsii.org - -

: 0.022 .