BinNode接口实现
template <typename T> BinNodePosi(T) BinNode<T> ::insertAsLc(T const &e)
{
return Lchild=new BinNode(e,this);
}
template <typename T>
int BinNode<T>::size()
{
//后代总数,亦即以其为根的子树的规模
int s=1;//计入本身
if(lchild) s+=lchild->size();//递归计入左子树的规模
if(rchild) s+=rchild->size();//递归计入右子树规模
return s;
}//o(n=|size|)
template <typename T> class BinTree
{
protected:
int _size;//规模
BinNodePosi(T) _root;//根结点
virtual int updateHeight(BinNodePosi(T) x);//更新结点x的高度
//为什么在这里定义为virtual类
//因为在很多的二叉树中其对于高度的定义都是不尽相同的,用virture便于重写
void updateHeightAbove(BinNodePosi(T) x);//更新x及祖先的高度
public:
int size() const {return _size;}//规模
bool empty() const {return !_root;}//判空
BinNodePosi(T) root() const {return _root;}//树根
}
1.1高度更新
#define starture(p) ( (p)?(p)->height:-1 )
template <typename T> //更新结点x高度,具体规则因树不同而异
int BinTree<T>::updateHeight(BinNodePosi(T) x)
{
return x->height=1+max(stature(x->lchild),stature(x->rchild));
}
1.2结点插入
template <typename T>BinNodePosi(T)
BinTree<T>::insertAsRc(BinNodePosi(T) x,T const& e)//插入右结点
{
//insertAsLc()对称
_size++;
x->insertAsRc(e);
updateHeightAbove(x);
return x->rchild;
}