• 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
160 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 (36,960 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 (36,960 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ź 398 wizyt
pytanie zadane 4 lutego 2020 w C i C++ przez Kate1243 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 1,113 wizyt
pytanie zadane 2 kwietnia 2019 w C i C++ przez Zielony12 Nowicjusz (200 p.)
0 głosów
1 odpowiedź 318 wizyt
pytanie zadane 24 maja 2018 w C i C++ przez kikosiak Obywatel (1,010 p.)

93,440 zapytań

142,431 odpowiedzi

322,679 komentarzy

62,802 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

...