AiSD wykład drzewa (procedury)

background image

Struktury danych - drzewa

wat-wdp@wp.pl

background image

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

dr

background image

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

null

dr

background image

Struktury danych - drzewa

Wstawianie elementów do

drzewa

background image

null

dr

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

background image

null

dr

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

Pod adres przekazany przez parametr d
zapisz adres (wskaźnik) zwrócony przez
funkcję malloc;
*d jest adresem obiektu typu Tdrzewo
(wskaźnika)

background image

dr

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

*d – adres wskaźnika (Tdrzewo jest
wskaźnikiem)
**d – struktura wskazywana przez
wskaźnik *r
(**d).prawy – pole struktury
&(**d).prawy – adres pola struktury
(wskaźnik)

background image

dr

prawy null

lewy null

elem 10

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

background image

dr

prawy null

lewy null

elem 10

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

background image

dr

prawy null

lewy null

elem 10

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

background image

dr

prawy null

lewy null

elem 10

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

background image

dr

prawy null

lewy null

elem 10

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

background image

d

dr

prawy null

lewy null

elem 10

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

background image

d

dr

prawy null

lewy null

elem 10

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

background image

d

dr

prawy null

lewy

elem 10

prawy null

lewy null

elem 5

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

background image

dr

prawy null

lewy

elem 10

prawy null

lewy null

elem 5

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wstaw_do_drzewa (Tdrzewo* d, Telem e) {
if (*d == NULL) {
*d = (Tdrzewo)malloc(sizeof(Telem_drzewa));
(**d).lewy = NULL;
(**d).prawy = NULL;
(**d).elem = e;
} else {
if ((**d).elem > e) {

wstaw_do_drzewa(&(**d).lewy,e);

} else {

wstaw_do_drzewa(&(**d).prawy,e);
}

}
}

background image

dr

prawy null

lewy

elem 10

prawy null

lewy null

elem 5

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

background image

dr

prawy null

lewy

elem 10

prawy null

lewy

elem 5

prawy null

lewy null

elem 3

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

background image

dr

prawy null

lewy

elem 10

prawy

lewy

elem 5

prawy null

lewy null

elem 3

prawy null

lewy null

el 7

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

background image

dr

prawy

lewy

elem 10

prawy

lewy

elem 5

prawy null

lewy null

elem 3

prawy null

lewy null

elem 7

prawy null

lewy null

elem 15

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

background image

Struktury danych - drzewa

Drukowanie struktury drzewa

background image

d

r

p

ra

w

y

le

w

y

e

le

m

1

0

p

ra

w

y

le

w

y

e

le

m

5

p

ra

w

y

n

u

ll

le

w

y

n

u

ll

e

le

m

3

p

ra

w

y

n

u

ll

le

w

y

n

u

ll

e

le

m

7

p

ra

w

y

n

u

ll

le

w

y

n

u

ll

e

le

m

1

5

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wypisz_drzewo (Tdrzewo d, int odl) {
if (d != NULL) {
wypisz_drzewo((*d).prawy,odl+_skok);

printf("\n");
for (int i = 0; i < odl; printf(" "), i++);
wypisz_elem((*d).elem);

wypisz_drzewo((*d).lewy,odl+_skok);
}
}

background image

d

r

p

ra

w

y

le

w

y

e

le

m

1

0

p

ra

w

y

le

w

y

e

le

m

5

e

le

m

3

e

le

m

7

p

ra

w

y

n

u

ll

le

w

y

n

u

ll

e

le

m

1

5

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wypisz_drzewo (Tdrzewo d, int odl) {
if (d != NULL) {
wypisz_drzewo((*d).prawy,odl+_skok);

printf("\n");
for (int i = 0; i < odl; printf(" "), i++);
wypisz_elem((*d).elem);

wypisz_drzewo((*d).lewy,odl+_skok);
}
}

background image

d

r

p

ra

w

y

le

w

y

e

le

m

1

0

p

ra

w

y

le

w

y

e

le

m

5

p

ra

w

y

n

u

ll

le

w

y

n

u

ll

e

le

m

3

p

ra

w

y

n

u

ll

le

w

y

n

u

ll

e

le

m

7

p

ra

w

y

n

u

ll

le

w

y

n

u

ll

e

le

m

1

5

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wypisz_drzewo (Tdrzewo d, int odl) {
if (d != NULL) {
wypisz_drzewo((*d).prawy,odl+_skok);

printf("\n");
for (int i = 0; i < odl; printf(" "), i++);
wypisz_elem((*d).elem);

wypisz_drzewo((*d).lewy,odl+_skok);
}
}

background image

d

r

p

ra

w

y

le

w

y

e

le

m

1

0

p

ra

w

y

le

w

y

e

le

m

5

p

ra

w

y

n

u

ll

le

w

y

n

u

ll

e

le

m

3

p

ra

w

y

n

u

ll

le

w

y

n

u

ll

e

le

m

7

p

ra

w

y

n

u

ll

le

w

y

n

u

ll

e

le

m

1

5

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

void wypisz_drzewo (Tdrzewo d, int odl) {
if (d != NULL) {
wypisz_drzewo((*d).prawy,odl+_skok);

printf("\n");
for (int i = 0; i < odl; printf(" "), i++);
wypisz_elem((*d).elem);

wypisz_drzewo((*d).lewy,odl+_skok);
}
}

background image

dr

prawy

lewy

elem 10

prawy

lewy

elem 5

prawy null

lewy null

elem 3

prawy null

lewy null

elem 7

prawy null

lewy null

elem 15

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

na później

background image

dr

prawy

lewy

elem 10

prawy

lewy

elem 5

prawy null

lewy null

elem 3

prawy null

lewy null

elem 7

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

prawy null

lewy null

elem 15

background image

Struktury danych - drzewa

Usuwanie drzewa

background image

dr

prawy

lewy

elem 10

prawy

lewy

elem 5

prawy null

lewy null

elem 3

prawy null

lewy null

elem 7

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

usun_drzewo(&dr);

}

prawy null

lewy null

elem 15

void usun_drzewo (Tdrzewo* d) {
if (*d != NULL) {
usun_drzewo(&(**d).lewy);
usun_drzewo(&(**d).prawy);
free(*d);
*d = NULL;
}
}

background image

dr

prawy

lewy

elem 10

prawy

lewy

elem 5

prawy null

lewy null

elem 3

prawy null

lewy null

elem 7

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

usun_drzewo(&dr);

}

void usun_drzewo (Tdrzewo* d) {
if (*d != NULL) {
usun_drzewo(&(**d).lewy);
usun_drzewo(&(**d).prawy);
free(*d);
*d = NULL;
}
}

prawy null

lewy null

elem 15

background image

dr

prawy

lewy null

elem 10

prawy null

lewy null

elem 15

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

usun_drzewo(&dr);

}

void usun_drzewo (Tdrzewo* d) {
if (*d != NULL) {
usun_drzewo(&(**d).lewy);
usun_drzewo(&(**d).prawy);
free(*d);
*d = NULL;
}
}

background image

dr

prawy null

lewy null

elem 10

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

usun_drzewo(&dr);

}

void usun_drzewo (Tdrzewo* d) {
if (*d != NULL) {
usun_drzewo(&(**d).lewy);
usun_drzewo(&(**d).prawy);
free(*d);
*d = NULL;
}
}

background image

???

dr

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

usun_drzewo(&dr);

}

void usun_drzewo (Tdrzewo* d) {
if (*d != NULL) {
usun_drzewo(&(**d).lewy);
usun_drzewo(&(**d).prawy);
free(*d);
*d = NULL;
}
}

background image

null

dr

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

usun_drzewo(&dr);

}

void usun_drzewo (Tdrzewo* d) {
if (*d != NULL) {
usun_drzewo(&(**d).lewy);
usun_drzewo(&(**d).prawy);
free(*d);
*d = NULL;
}
}

background image

null

dr

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

background image

Struktury danych - drzewa

Usuwanie elementów struktury

drzewa

background image

dr

prawy

lewy

elem 10

prawy

lewy

elem 5

prawy null

lewy null

elem 3

prawy null

lewy null

elem 7

prawy null

lewy null

elem 15

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

main() {

Tdrzewo dr = NULL;

wstaw_do_drzewa(&dr,10);

wstaw_do_drzewa(&dr, 5);

wstaw_do_drzewa(&dr, 3);

wstaw_do_drzewa(&dr, 7);

wstaw_do_drzewa(&dr,15);

wypisz_drzewo(dr,_skok);

if (usun_z_drzewa(&dr,5)) {

wypisz_drzewo(dr,_skok);

}

usun_drzewo(&dr);

}

teraz

background image

dr

50

25

75

10

60

28

65

30

20

7

29

15

22

27

21

brak następników

jeden następnik

dwa następniki

Usuwanie elementów z drzewa

background image

int usun_z_drzewa (Tdrzewo* d, Telem e)
{
if (*d != NULL) {

if ((**d).elem > e)

usun_z_drzewa(&(**d).lewy,e);
else {
if ((**d).elem < e)

usun_z_drzewa(&(**d).prawy,e);

else {

q = *d;

if ((*q).lewy == NULL)
*d = (*q).prawy;
else {
if ((*q).prawy == NULL)
*d = (*q).lewy;

else

usun(&(*q).lewy);

}
free(q);
return(1);

}
}
} else
return(0);
}

dr

50

25

75

10

60

28

65

30

20

7

29

15

22

27

21

wyszukanie elementu

do usunięcia

sprawdzenie, czy

jest jeden lub brak

następnika

usunięcie, jeśli są

dwa następniki

background image

int usun_z_drzewa (Tdrzewo* d, Telem e)
{
if (*d != NULL) {

if ((**d).elem > e)

usun_z_drzewa(&(**d).lewy,e);
else {
if ((**d).elem < e)

usun_z_drzewa(&(**d).prawy,e);

else {

q = *d;

if ((*q).lewy == NULL)
*d = (*q).prawy;
else {
if ((*q).prawy == NULL)
*d = (*q).lewy;

else

usun(&(*q).lewy);

}
free(q);
return(1);

}
}
} else
return(0);
}

dr

50

25

75

10

60

28

65

30

20

7

29

15

22

27

21

np.: usun_z_drzewa (dr, 75);

q

background image

int usun_z_drzewa (Tdrzewo* d, Telem e)
{
if (*d != NULL) {

if ((**d).elem > e)

usun_z_drzewa(&(**d).lewy,e);
else {
if ((**d).elem < e)

usun_z_drzewa(&(**d).prawy,e);

else {

q = *d;

if ((*q).lewy == NULL)
*d = (*q).prawy;
else {
if ((*q).prawy == NULL)
*d = (*q).lewy;

else

usun(&(*q).lewy);

}
free(q);
return(1);

}
}
} else
return(0);
}

r

dr

50

25

10

60

28

65

30

20

7

29

15

22

27

21

void usun(Tdrzewo* r) {
if ((**r).prawy != NULL)

usun(&(**r).prawy);

else {

(*q).elem = (**r).elem;
q = *r;
*r = (**r).lewy;

}
}

znalezienie skrajnego

prawego w lewym

poddrzewie

kopiowanie

znalezionego do

usuwanego

q

np.: usun_z_drzewa (dr, 25);

*r – adres wskaźnika (Tdrzewo jest
wskaźnikiem)
**r – struktura wskazywana przez
wskaźnik *r
(**r).prawy – pole struktury
&(**r).prawy – adres pola struktury
(wskaźnik)

background image

r

dr

50

25

10

60

28

65

30

20

7

29

15

22

27

21

q

int usun_z_drzewa (Tdrzewo* d, Telem e)
{
if (*d != NULL) {

if ((**d).elem > e)

usun_z_drzewa(&(**d).lewy,e);
else {
if ((**d).elem < e)

usun_z_drzewa(&(**d).prawy,e);

else {

q = *d;

if ((*q).lewy == NULL)
*d = (*q).prawy;
else {
if ((*q).prawy == NULL)
*d = (*q).lewy;

else

usun(&(*q).lewy);

}
free(q);
return(1);

}
}
} else
return(0);
}

void usun(Tdrzewo* r) {
if ((**r).prawy != NULL)

usun(&(**r).prawy);

else {

(*q).elem = (**r).elem;
q = *r;
*r = (**r).lewy;

}
}

np.: usun_z_drzewa (dr, 25);

background image

r

dr

50

22

10

60

28

65

30

20

7

29

15

22

27

21

q

int usun_z_drzewa (Tdrzewo* d, Telem e)
{
if (*d != NULL) {

if ((**d).elem > e)

usun_z_drzewa(&(**d).lewy,e);
else {
if ((**d).elem < e)

usun_z_drzewa(&(**d).prawy,e);

else {

q = *d;

if ((*q).lewy == NULL)
*d = (*q).prawy;
else {
if ((*q).prawy == NULL)
*d = (*q).lewy;

else

usun(&(*q).lewy);

}
free(q);
return(1);

}
}
} else
return(0);
}

void usun(Tdrzewo* r) {
if ((**r).prawy != NULL)

usun(&(**r).prawy);

else {

(*q).elem = (**r).elem;
q = *r;
*r = (**r).lewy;

}
}

np.: usun_z_drzewa (dr, 25);

background image

r

dr

50

22

10

60

28

65

30

20

7

29

15

22

27

21

q

int usun_z_drzewa (Tdrzewo* d, Telem e)
{
if (*d != NULL) {

if ((**d).elem > e)

usun_z_drzewa(&(**d).lewy,e);
else {
if ((**d).elem < e)

usun_z_drzewa(&(**d).prawy,e);

else {

q = *d;

if ((*q).lewy == NULL)
*d = (*q).prawy;
else {
if ((*q).prawy == NULL)
*d = (*q).lewy;

else

usun(&(*q).lewy);

}
free(q);
return(1);

}
}
} else
return(0);
}

void usun(Tdrzewo* r) {
if ((**r).prawy != NULL)

usun(&(**r).prawy);

else {

(*q).elem = (**r).elem;
q = *r;
*r = (**r).lewy;

}
}

np.: usun_z_drzewa (dr, 25);

background image

dr

50

22

10

60

28

65

30

20

7

29

15

22

27

21

q

int usun_z_drzewa (Tdrzewo* d, Telem e)
{
if (*d != NULL) {

if ((**d).elem > e)

usun_z_drzewa(&(**d).lewy,e);
else {
if ((**d).elem < e)

usun_z_drzewa(&(**d).prawy,e);

else {

q = *d;

if ((*q).lewy == NULL)
*d = (*q).prawy;
else {
if ((*q).prawy == NULL)
*d = (*q).lewy;

else

usun(&(*q).lewy);

}
free(q);
return(1);

}
}
} else
return(0);
}

void usun(Tdrzewo* r) {
if ((**r).prawy != NULL)

usun(&(**r).prawy);

else {

(*q).elem = (**r).elem;
q = *r;
*r = (**r).lewy;

}
}

np.: usun_z_drzewa (dr, 25);

background image

dr

50

22

10

60

28

65

30

20

7

29

15

22

27

21

q

int usun_z_drzewa (Tdrzewo* d, Telem e)
{
if (*d != NULL) {

if ((**d).elem > e)

usun_z_drzewa(&(**d).lewy,e);
else {
if ((**d).elem < e)

usun_z_drzewa(&(**d).prawy,e);

else {

q = *d;

if ((*q).lewy == NULL)
*d = (*q).prawy;
else {
if ((*q).prawy == NULL)
*d = (*q).lewy;

else

usun(&(*q).lewy);

}
free(q);
return(1);

}
}
} else
return(0);
}

np.: usun_z_drzewa (dr, 25);

background image

dr

50

22

10

60

28

65

30

20

7

29

15

27

21

q

int usun_z_drzewa (Tdrzewo* d, Telem e)
{
if (*d != NULL) {

if ((**d).elem > e)

usun_z_drzewa(&(**d).lewy,e);
else {
if ((**d).elem < e)

usun_z_drzewa(&(**d).prawy,e);

else {

q = *d;

if ((*q).lewy == NULL)
*d = (*q).prawy;
else {
if ((*q).prawy == NULL)
*d = (*q).lewy;

else

usun(&(*q).lewy);

}
free(q);
return(1);

}
}
} else
return(0);
}

np.: usun_z_drzewa (dr, 25);

background image

dr

50

22

10

60

28

65

30

20

7

29

15

27

21

background image

Struktury danych - drzewa

Pakiet przykładowych

operacji

background image

/* drzewo.h */

#if !defined(__drzewo_H)

#define __drzewo_H

typedef int Telem;

typedef struct Telem_drzewa {

Telem_drzewa* lewy;

Telem_drzewa* prawy;

Telem elem;

};

typedef Telem_drzewa* Tdrzewo;

void wstaw_do_drzewa (Tdrzewo* d, Telem e);

void usun_drzewo (Tdrzewo* d);

int usun_z_drzewa (Tdrzewo* d, Telem e);

#define _skok 4

void wypisz_drzewo (Tdrzewo d, int odl);

void wypisz_elem (Telem e);

#endif /* __drzewo_H */


Document Outline


Wyszukiwarka

Podobne podstrony:
AiSD wykład listy (procedury)
AiSD Wyklad4 dzienne id 53497 Nieznany (2)
AiSD wyklad 3
AiSD Wyklad9 dzienne id 53501 Nieznany
AiSD Wyklad2 dzienne
AiSD Wyklad1 dzienne
AiSD wyklad 1 id 53489 Nieznany
AiSD Wyklad11 dzienne id 53494 Nieznany
Wykład 4 Alarmy i procedury SAR na statku AAA
Algorytmy i struktury danych AiSD-C-Wyklad05
AiSD wyklad 5
AiSD Wyklad1 dzienne
AiSD Wyklad6 dzienne id 53499 Nieznany (2)
AiSD Wyklad7 dzienne id 53500 Nieznany (2)
AiSD wyklad 9 id 53492 Nieznany (2)
AiSD Wyklad3 dzienne id 53496 Nieznany (2)
Algorytmy i struktury danych, AiSD C Wyklad04 2
procedury budżetowe wykłady, FiR, Procedury Budżetowe

więcej podobnych podstron