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

Drzewo binarne w c++11 , wskaźniki inteligentne

VPS Starter Arubacloud
+1 głos
212 wizyt
pytanie zadane 30 sierpnia 2019 w C i C++ przez DamianW Bywalec (2,080 p.)

Witam. Zaczynam naukę biblioteki <memory> (korzystam z strony cppreference.com). Na początek chciałem stworzyć sobie takie podstawowe drzewo binarne z wykorzystaniem shared_ptr. Jednak metoda prnt() nie wyświetla prawidłowo kluczy węzłów. Oto kod:

#ifndef BTree
#define BTree
#include<memory>
#include<iostream>
using namespace std;
template<class T>
class Node {
	template<class T> friend class BTree;
	typedef shared_ptr<Node<T>> N_ptr;
	friend int main();
private:
	N_ptr left, right;
	T key;
	Node(const T&, N_ptr = nullptr, N_ptr = nullptr);
	Node();
};

template<class T>
class BTree{
	typedef shared_ptr<Node<T>> N_ptr;
	friend int main();
public:
	BTree();
	void insrt(const T&);
	void prnt();
private:
	void srch(const T&, N_ptr&);
	N_ptr root;
	void prnt(N_ptr);
};

#endif // !BTree

template<class T>
Node<T>::Node(const T& nKey, N_ptr nLeft, N_ptr nRight) : key{ nKey }, left{ nLeft },
right{ nRight } {}

template<class T>
Node<T>::Node() :left{ nullptr },right{ nullptr } {}

template<class T>
BTree<T>::BTree() : root{ nullptr }{}

template<class T>
void BTree<T>::srch(const T& nKey,N_ptr& prev) {
	if (root != nullptr) {
		N_ptr ptr = root;
		while (ptr != nullptr) {
			prev = ptr;
			if (nKey > ptr->key)
				ptr = ptr->right;
			else ptr = ptr->left;
		}
	}
}

template<class T>
void BTree<T>::insrt(const T& nKey) {
	N_ptr newNode(new Node<T>(nKey));
	if (root == nullptr)
		root.swap(newNode);
	else {
		N_ptr prsnt = nullptr; 
		srch(nKey,prsnt);
		cout << prsnt->key << endl;
		if (nKey > prsnt->key)
			prsnt->right.swap(newNode);
		else prsnt->left.swap(newNode);
	}

}

template<class T>
void BTree<T>::prnt() {
	prnt(root);
}

template<class T>
void BTree<T>::prnt(N_ptr node) {
	if (node != nullptr) {
		prnt(node->left);
		cout << node->key << endl;
		prnt(node->right);
	}
}

Wejście( int main() ):

	BTree<int> tree;
	tree.insrt(5);
	tree.insrt(6);
	tree.insrt(4);
	tree.prnt();

Wyjście:

5
5
4
5
6

Ktoś ma pomysł co zepsułem ? Z góry dziękuję

komentarz 30 sierpnia 2019 przez tangarr Mędrzec (154,900 p.)
Dlaczego twierdzisz, że wyjście programu jest nieprawidłowe?
komentarz 30 sierpnia 2019 przez DamianW Bywalec (2,080 p.)
Gdyż powinno być : 4 5 6
1
komentarz 30 sierpnia 2019 przez tangarr Mędrzec (154,900 p.)
Dwie pierwsze linijki są wygenerowane przez funkcję insert.
Funkcja prnt drukuje: 4 5 6
komentarz 30 sierpnia 2019 przez DamianW Bywalec (2,080 p.)
Rzeczywiście.... tyle szukania... . Nie zauważyłem :D

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 622 wizyt
pytanie zadane 19 stycznia 2019 w C i C++ przez profsor500 Użytkownik (610 p.)
0 głosów
1 odpowiedź 2,580 wizyt
0 głosów
1 odpowiedź 370 wizyt
pytanie zadane 2 kwietnia 2017 w C i C++ przez krzakurts Obywatel (1,470 p.)

92,775 zapytań

141,702 odpowiedzi

320,553 komentarzy

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

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!

...