• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

drzewa BST - dodawanie węzła i przechodzenie

Object Storage Arubacloud
0 głosów
89 wizyt
pytanie zadane 28 listopada 2023 w C i C++ przez natalia2002. Początkujący (400 p.)

Napisałam funkcje, ktora ma dodawac elementy do drzewa a nastepnie funkcje ktora zajmuje sie przechodzeniem drzewa, co jest z nimi nie tak, ze jak uruchamiam program to nic mi sie nie wyswietla?

#include<iostream>
using namespace std;

struct node
{
	node* p;
	node* L;
	node* R;
	int val;
};


void insert_BST(node* root, int x, node* parent = NULL)
{
	if (root == NULL)
	{
		node* e = new node;
		e->val = x;
		e->p = parent;
		e->L = NULL;
		e->R = NULL;
		root = e;
	}
	else
	{
		if (x <= root->val)
			insert_BST(root->L, x, root);
		else
			insert_BST(root->R, x, root);
	}
}

void inorder(node* root)
{
	if (root != NULL)
	{
		inorder(root->L);
		cout << root->val << " ";
		inorder(root->R);
	}
}

int main()
{
	node* root = NULL;
	insert_BST(root, 20);
	insert_BST(root, 11);
	insert_BST(root, 10);
	insert_BST(root, 33);
	insert_BST(root, 15);
	insert_BST(root, 27);
	insert_BST(root, 47);
	insert_BST(root, 35);
	insert_BST(root, 49);
	insert_BST(root, 8);
	insert_BST(root, 2);
	insert_BST(root, 9);
	insert_BST(root, 19);
	insert_BST(root, 14);
	inorder(root);

	return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 29 listopada 2023 przez jankustosz1 Nałogowiec (35,880 p.)
Problem jest że przekazujesz do funkcji wskaźnik root. Następnie funkcja robi sobie kopię wskaźnika root wskazując na to samo co oryginalny wskaźnik. Później ustawiasz tą kopię, aby wskazywała na e (Nie jest to oryginalny root!)

Musisz do funkcji przekazać wskaźnik na wskaźnik do node, albo referencję na wskaźnik do node.

Nie polecam c++ ;)
komentarz 29 listopada 2023 przez natalia2002. Początkujący (400 p.)
ajj faktycznie racja dziękuję bardzo :) niestety taki język mamy na zajęciach ;)
komentarz 29 listopada 2023 przez natalia2002. Początkujący (400 p.)

a mam jeszcze takie pytanko, chcialabym zeby funkcja wyswietlala mi poprzednika danego wezla i dziala poprawnie do momentu, w ktorym chce wyswietlic poprzednika wezla e, ktory jest lewym synem y, tam nie wyswietla mi poprzednika tego wezla tylko jego rodzica (else if (e == y->L) - od tego momentu) :(

void prev(node* e)
{
	if (e->L != NULL)
		max(e->L);
	else
	{
		node* y = e->p;      //y-rodzic e
		if (y != NULL)
		{
			if (e = y->R)
				cout << y->val;
			else if (e == y->L)
			{
				while (y != NULL && e == y->L)
				{
					e = y;
					y = y->p;
				}
					cout << y;
			}
		}
	}
}

 

komentarz 30 listopada 2023 przez jankustosz1 Nałogowiec (35,880 p.)

Dwie rzeczy:

if (e = y->R)

W cywilizowanym języku programowania taki zapis byłby niedozwolony.

max(e->L);

Rozumiem, że chodziło o prev(e->L)

Chcesz wyświetlić ścieżkę do lewego dolnego węzła?
Jeżeli tak to najprościej w ten sposób:

void prev(node* e)
{
    if (e->L != NULL){
      cout << e->val;  /// jezeli chcesz odwrócić kolejność to zamień miejscami te 2 linijki
      prev(e->L);
    }
    else
    {
       cout << e->val;
    }
}

 

Podobne pytania

0 głosów
1 odpowiedź 310 wizyt
pytanie zadane 4 lutego 2020 w C i C++ przez Kate1243 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 728 wizyt
pytanie zadane 2 kwietnia 2019 w C i C++ przez Zielony12 Nowicjusz (200 p.)
0 głosów
1 odpowiedź 214 wizyt
pytanie zadane 24 maja 2018 w C i C++ przez kikosiak Obywatel (1,010 p.)

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...