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

Posted

技术标签:

【中文标题】在二叉搜索树中查找中位数的错误【英文标题】:Errors in finding the median in binary search tree 【发布时间】:2015-05-01 17:03:06 【问题描述】:

编写函数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);

构建时出现以下错误:

有人知道如何解决这个问题吗?这段代码是否适用于偶数个元素?

【问题讨论】:

这是Find median in binary search tree的后续问题 你的实现不可能是O(n)时间。你打电话给Count() 太频繁了。 由于您只想使用一个 const 函数,我强烈建议您使用算法的迭代版本:lixinglian.com/idea/?p=358 那个中位数查找函数不可能是正确的。 @NiklasB。 link这个怎么样? 【参考方案1】:

在函数 findMedian 中将index 设为静态局部变量。 不建议这样做,但当坚持使用一个 const 递归函数时,这是一种解决方案。

【讨论】:

而不是return; 使用return null; 来返回一些琐碎的东西。

以上是关于在二叉搜索树中查找中位数的错误的主要内容,如果未能解决你的问题,请参考以下文章

在二叉搜索树中查找地板和天花板

二叉搜索树

在二叉查找树中插入节点

c++ 在二叉搜索树中删除

使用递归 DFS 在二叉树中查找节点

在二叉搜索树中找到一个节点的父节点