Napisz implementację funkcji T ComputeMedian() const
, która oblicza medianę w drzewie w czasie O (n). Załóżmy, że drzewo jest BST, ale niekoniecznie jest zrównoważone. Przypomnijmy, że mediana liczb n jest zdefiniowana następująco: jeśli n jest nieparzyste, medianą jest x takie, że liczba wartości mniejszych od x jest równa liczbie wartości większej niż x. Jeśli n jest parzyste, to jeden plus liczba wartości mniejszych od x jest równa liczbie wartości większej od x. Na przykład, biorąc pod uwagę liczby 8, 7, 2, 5, 9, mediana wynosi 7, ponieważ istnieją dwie wartości mniejsze niż 7 i dwie wartości większe niż 7. Jeśli dodamy do zestawu liczbę 3, mediana stanie się 5.Znajdź medianę w drzewie wyszukiwania binarnego
Oto klasa binarny węzła szukaj drzewa:
template <class T>
class BSTNode
{
public:
BSTNode(T& val, BSTNode* left, BSTNode* right);
~BSTNode();
T GetVal();
BSTNode* GetLeft();
BSTNode* GetRight();
private:
T val;
BSTNode* left;
BSTNode* right;
BSTNode* parent; //ONLY INSERT IS READY TO UPDATE THIS MEMBER DATA
int depth, height;
friend class BST<T>;
};
Binary klasa wyszukiwania drzewo:
template <class T>
class BST
{
public:
BST();
~BST();
bool Search(T& val);
bool Search(T& val, BSTNode<T>* node);
void Insert(T& val);
bool DeleteNode(T& val);
void BFT(void);
void PreorderDFT(void);
void PreorderDFT(BSTNode<T>* node);
void PostorderDFT(BSTNode<T>* node);
void InorderDFT(BSTNode<T>* node);
void ComputeNodeDepths(void);
void ComputeNodeHeights(void);
bool IsEmpty(void);
void Visit(BSTNode<T>* node);
void Clear(void);
private:
BSTNode<T> *root;
int depth;
int count;
BSTNode<T> *med; // I've added this member data.
void DelSingle(BSTNode<T>*& ptr);
void DelDoubleByCopying(BSTNode<T>* node);
void ComputeDepth(BSTNode<T>* node, BSTNode<T>* parent);
void ComputeHeight(BSTNode<T>* node);
void Clear(BSTNode<T>* node);
};
wiem, że powinienem liczyć węzły drzewa, a potem zrobić przechodzenie inorder aż osiągnę (n/2) węzeł i zwrócę go. Po prostu nie mam pojęcia jak.
W przypadku listy, musisz zacząć wskazywać na obu końcach i pracować do wewnątrz, aby znaleźć medianę. Ale ponieważ twoje drzewo nie jest zrównoważone, najgorszy przypadek zmniejsza się do listy połączonej. Dlatego nie można uniknąć tego samego. Zacznij wskazywać wartości min i maksimum, a na przemian obliczaj kolejność-następcę (min) i poprzednik-kolejność (maks.), Aż będą równe. – BadZen
@BadZen Nie jestem do końca zaznajomiony z "odbiornikiem-poprzednikiem". Czy mógłbyś wyjaśnić dalej? –
Następujące() i Poprzednie() wartości drzewa. – BadZen