chciałbym napisać swoje BST, mam z tym problem

0

Witam.

C++ juz dawno nie ruszalem (nigdy nie umialem go za dobrze). Ale tak dla odswiezenia chcialem sobie napisac BST. Pomoze ktos z kodem ? Nie chce kodu, a raczej moze wskazowki, albo sygnatury funkcji ? Zalezy mi jak najbardziej przejrzystym i wydajnym kodem.
Wiec prosze o uwagi jak powinno wygladac dodawanie elementu (nie wiem czy nie wymylilem sie tu ze wskaznikami) , oraz jak zaprojektowac funkcje drukujaca....

#include "stdafx.h"
#include <iostream>


struct PNode
{
	int a;
	PNode *Right;
	PNode *Left;
};

class BST
{
private:
	PNode *T;
public:
	BST();
	~BST() {};
	void Insert(int Item);
	void PrintTree();
};

BST::BST()
{
	T = NULL;
}

void BST::Insert(int Item)
{
	if(T == NULL)
	{
		PNode *Elem = new(PNode);
		Elem->Left = NULL;
		Elem->Right = NULL;
		Elem->a = Item;
		T = Elem;
	}
	else
	{
		if(T->a < Item)
			T = T->Left;
		else
			T = T->Right;
		Insert(Item);
	}
}


void BST::PrintTree()
{
	while(T != NULL)
	{
		std::cout << T->a;
               //jak tutaj to rozwiazac ?
	}
}

int main()
{
	BST *tree = new(BST);
	for(int i=0;i<10;++i)
		tree->Insert(i);
	tree->PrintTree();
	tree->~BST();
	return 0;
}

0
  1. fail: nie new(BST) tylko new BST();
  2. fail: nie tree->~BST() tylko delete tree;
  3. funkcja drukujaca imho, najlepiej jezeli bedzie rekurencyjna, np dfs, wypisywala 1 element per linia, i bedzie brala parametr "glebokosc" aby wiedziec jak duze wciecia robic przed elementem
  4. BST to BinarySearchTree? to czmeu to robisz porzez liste?
  5. Twoje Insert wyglada dziwnie, po co dziwny tail call zamiast petli? poza tym, jaki jest sens tego tail call'a z merdaniem sie lewo-prawo oraz tej-pierwszej-czesci tworzacej nowy wezel? przeciez jak juz dojdziesz gdzies do skraju to T->Left albo T->Right bedzie null i nowoutworzony wezel bedzie oderwany bo na chama ustawiasz mu left=right=null. poza tym, co to za merdanie sie lewo-prawo po jednym if-else'ie, a co Ci sie zrobi jak nagle bedzie == ?
0

ad 4.
Nie bardzo rozumiem. A jak powinno się to zrobić ?
Przecież w najgorszym przypadku, drzewo jest listą ?
Powinienem inną obrać strukturę ?

a wstawianie elementu odbywa się tak ?

  1. Jesli korzen jest pusty (czyli moj *T) to utworz element i niech bedzie korzeniem.
  2. W przeciwnym wypadku, przegladaj drzewo w dół (czyli przypisanie T = T->Left (w zaleznosci czy element jest mniejszy, badz else).
    2a. W koncu sie dojdzie do nulla, no i faktycznie, tu jest urwanie...
0

uwaga dot. listy (4)
Sorry, zasugerowalem sie struktura danych bez "parent", ktore nie jest stricte potrzebne, i sam nie wiem czemu wygladalo mi to na liste dwukierunkowa. PNode jest 100% ok

  1. tak, powinno odbywac sie w ten sposob, z ta roznica, ze nie mozesz urywac.. brak ROOT'a jest przypadkiem hiper-szczegolnym, ktory w ogole rozpatruj gdzies na boku. Natomiast samo wstawianie musi zapamietywac gdzie-teraz-jestem i tworzac nowy wezel musi go podczepiac pod wlasciwą "łapkę" owego gdzieterazjestem. Najszybciej to zrobisz, zmieniajac swoje Insert(wartosc) na Insert(root, wartosc) ktore bedzie rekurencyjnie wywolywac sie, np. wykrywszy ze musi zejsc w lewoL Insert(root->lewo, wartosc). W ten sposob, pod-wykonanie insert'a bedzie wiedzialo w ktorym wezle aktualnie jest i bedzie moglo do niego cos przypiac..

1 użytkowników online, w tym zalogowanych: 0, gości: 1