在二叉搜索树中寻找中位数的错误
Errors in finding the median in binary search tree
编写函数 T findMedian() const
的实现,该函数在 O(n) 时间内计算树中的中值。假设这棵树是 BST 但不一定是平衡的。回想一下 n 个数字的中位数定义如下:如果 n 是奇数,则中位数是 x,使得小于 x 的值的数量等于大于 x 的值的数量。如果 n 是偶数,则一加上小于 x 的值的个数等于大于 x 的值的个数。例如,给定数字 8、7、2、5、9,中位数是 7,因为有两个值小于 7 和两个值大于 7。如果我们将数字 3 添加到集合中,则中位数变为 5。
这里是二叉搜索树节点的class:
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>;
};
二叉搜索树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;
};
计数代码如下:
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);
}
构建时出现以下错误:
有人知道如何解决这个问题吗?这段代码是否适用于偶数个元素?
在函数 findMedian 中使 index
成为 静态局部变量 。
不建议这样做,但是当坚持使用一个 const 递归函数时,这是一种解决方案。
编写函数 T findMedian() const
的实现,该函数在 O(n) 时间内计算树中的中值。假设这棵树是 BST 但不一定是平衡的。回想一下 n 个数字的中位数定义如下:如果 n 是奇数,则中位数是 x,使得小于 x 的值的数量等于大于 x 的值的数量。如果 n 是偶数,则一加上小于 x 的值的个数等于大于 x 的值的个数。例如,给定数字 8、7、2、5、9,中位数是 7,因为有两个值小于 7 和两个值大于 7。如果我们将数字 3 添加到集合中,则中位数变为 5。
这里是二叉搜索树节点的class:
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>;
};
二叉搜索树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;
};
计数代码如下:
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);
}
构建时出现以下错误:
有人知道如何解决这个问题吗?这段代码是否适用于偶数个元素?
在函数 findMedian 中使 index
成为 静态局部变量 。
不建议这样做,但是当坚持使用一个 const 递归函数时,这是一种解决方案。