• 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

0 głosów
241 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 (37,030 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 (37,030 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ź 478 wizyt
pytanie zadane 4 lutego 2020 w C i C++ przez Kate1243 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 1,322 wizyt
pytanie zadane 2 kwietnia 2019 w C i C++ przez Zielony12 Nowicjusz (200 p.)
0 głosów
1 odpowiedź 430 wizyt
pytanie zadane 24 maja 2018 w C i C++ przez kikosiak Obywatel (1,010 p.)

93,633 zapytań

142,558 odpowiedzi

323,058 komentarzy

63,141 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...