简体   繁体   中英

Errors in finding the median in binary search tree

Write the implementation of the function T findMedian() const that computes the median value in the tree in O(n) time. Assume that the tree is a BST but is not necessarily balanced. Recall that the median of n numbers is defined as follows: If n is odd, the median is x such that the number of values smaller than x is equal to the number of values greater than x. If n is even, then one plus the number of values smaller than x is equal to the number of values greater than x. For example, given the numbers 8, 7, 2, 5, 9, the median is 7, because there are two values smaller than 7 and two values larger than 7. If we add number 3 to the set, the median becomes 5.

Here is the class of binary search tree node:

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 search tree class:

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);
    int Count(void) const;
    T findMedian() const;

    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;
    int index = 0;; // 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);
    int Count(BSTNode<T>* node) const;
    T findMedian(BSTNode<T>* node) const;

};

Here is the count code:

template <class T>
int BST<T>::Count() const
{
    Count(root);
}

template <class T>
int BST<T>::Count(BSTNode<T>*node) const
{
    if (node == NULL)
        return 0;
    return 1 + Count(node->left) + Count(node->right);
} 

And here is the findMedian code:

template<class T>
T BST<T>::findMedian() const
{
    findMedian(root);
}

template <class T>
T BST<T>::findMedian(BSTNode<T>* node) const
{
    int counter = Count();
    if (node == NULL)
        return;
    T tmp = findMedian(node->left);
    if (tmp != NULL)
        return tmp;
    if (index == counter / 2)
        return node->val;
    index++;
    return findMedian(node->right);
}

When building it I get the following errors:

在此处输入图片说明

Anyone has any clue how to fix this? And will this code work with an even number of elements?

Make index a static local variable in the function findMedian. This is not recommended but one solution when it is insisted on having one const recursive function.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM