在二叉搜索树中查找中值的错误

时间:2015-05-01 17:03:07

标签: c++ algorithm tree binary-search-tree median

编写函数T findMedian() const的实现,该函数在O(n)时间内计算树中的中值。假设树是BST但不一定是平衡的。回想一下n个数的中值定义如下:如果n是奇数,则中值是x,使得小于x的值的数量等于大于x的值的数量。如果n是偶数,则一加上小于x的值的数量等于大于x的值的数量。例如,给定数字8,7,2,5,9,中位数为7,因为有两个小于7的值和两个大于7的值。如果我们将3加到集合中,则中位数变为5。

这是二叉搜索树节点的类:

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>;
};

二进制搜索树类:

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;

};

这是计数代码:

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);
} 

这是findMedian代码:

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);
}

构建它时,我收到以下错误:

enter image description here

任何人都有任何线索如何解决这个问题?这段代码是否适用于偶数个元素?

1 个答案:

答案 0 :(得分:-1)

在函数findMedian中使index成为静态局部变量。 这不是推荐的,而是在坚持使用一个const递归函数时的一个解决方案。