实现函数
以下是二叉搜索树节点的类:
T ComputeMedian() const
,以O(n)时间复杂度计算树中的中位数。假设树是BST(二叉搜索树),但不一定平衡。回想一下n个数字的中位数定义:如果n为奇数,则中位数为x,使得小于x的值的数量等于大于x的值的数量;如果n为偶数,则小于x的值的数量加上1等于大于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);
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);
};
我知道我应该首先计算树的节点数,然后进行中序遍历,直到达到第(n/2)个节点并返回它。但是我不知道该怎么做。