第1个回答 2012-06-15
//求二叉树的深度
template <class ElemType>
int BinaryTree<ElemType>::_Depth(BTNode<ElemType>* T)
{
if (!T)
return 0;
int h1,h2;
h1 = _Depth(T->lchild);
h2 = _Depth(T->rchild);
return h1 > h2 ? h1 + 1 : h2 + 1;
}
//先序递归遍历二叉树
template <class ElemType>
void BinaryTree<ElemType> ::_PreorderTraverse(BTNode<ElemType>* T,void (*visit)(const ElemType &e))
{
if (T){
visit(T->data);
_PreorderTraverse(T->lchild,visit);
_PreorderTraverse(T->rchild,visit);
}
}
//中序递归遍历二叉树
template <class ElemType>
void BinaryTree<ElemType> ::_InorderTraverse(BTNode<ElemType>* T,void (*visit)(const ElemType &e))
{
if (T) {
_InorderTraverse (T->lchild,visit);
visit(T->data);
_InorderTraverse (T->rchild,visit);
}
}
//后序递归遍历二叉树
template <class ElemType>
void BinaryTree<ElemType> ::_PostorderTraverse(BTNode<ElemType>* T,void (*visit)(const ElemType &e))
{
if (T){
_PostorderTraverse (T->lchild,visit);
_PostorderTraverse (T->rchild,visit);
visit (T->data);
}
}
//后序递归遍历方式换孩子
template <class ElemType>
void BinaryTree<ElemType> ::_PostTranChild(BTNode<ElemType>* T)
{ BTNode<ElemType> *p;
if (T){
_PostTranChild(T->lchild);
_PostTranChild(T->rchild);
p = T->lchild;
T->lchild = T->rchild;
T->rchild = p ;
}
}
//统计树叶结点个数
template <class ElemType>
void BinaryTree <ElemType>::_Countleaf(BTNode<ElemType>* T,int &n)
{
BTNode<ElemType> *p;
if (T){
_Countleaf(T->lchild, n);
_Countleaf(T->rchild, n);
if(!T->lchild && !T->rchild)
n++;
}
}
// 先序遍历二叉树的非递归算法(利用栈)
template <class ElemType>
void BinaryTree<ElemType> ::PreorderTraverseNonRecursive(void (*visit)(const ElemType &e))
{
stack<BTNode<ElemType> *> S;
BTNode<ElemType> *p;
S.push (m_root); //根指针进栈
while (!S.empty ()) {
p = S.top ();
while (p) {
visit(p->data);
p = p->lchild;
S.push(p); // 向左走到尽头
}
S.pop(); // 空指针退栈
if (!S.empty()){ // 访问结点,向右一步
p = S.top ();
S.pop();
S.push(p->rchild);
}
}
}
// 中序遍历二叉树的非递归算法(利用栈)
template <class ElemType>
void BinaryTree<ElemType> ::InorderTraverseNonRecursive(void (*visit)(const ElemType &e))
{
stack<BTNode<ElemType> *> S;
BTNode<ElemType> *p;
S.push (m_root); //根指针进栈
while (!S.empty ()) {
p = S.top ();
while (p) {
p = p->lchild;
S.push(p); // 向左走到尽头
}
S.pop(); // 空指针退栈
if (!S.empty()){ // 访问结点,向右一步
p = S.top ();
S.pop();
visit(p->data);
S.push(p->rchild);
}
}
}
// 后序遍历二叉树的非递归算法(利用栈)
template <class ElemType>
void BinaryTree<ElemType> ::PostorderTraverseNonRecursive(void (*visit)(const ElemType &e))
{
stack<BTNode<ElemType> *> S;
BTNode<ElemType> *p,*q = NULL;
S.push (m_root); //根指针进栈
while (!S.empty ()) {
p = S.top ();
while (p) {
p = p->lchild;
S.push(p); // 向左走到尽头
}
S.pop(); // 空指针退栈
if (!S.empty()){
p = S.top ();
if ( p->rchild )
S.push ( p->rchild );
else {
visit ( p->data );
S.pop();
if (!S.empty())
q = S.top ();
while ( q && q->rchild == p ) {
visit ( q->data );
p = q;
S.pop();
q = NULL;
if (!S.empty())
q = S.top ();
}
S.push ( NULL );
}//else
}//if
}//while
}
// 层次遍历二叉树的非递归算法(利用队列)
template <class ElemType>
void BinaryTree<ElemType> ::LevelTraverse(void (*visit)(const ElemType &e)){
queue<BTNode<ElemType> *> Q;
if (m_root)
Q.push (m_root);
while (!Q.empty ()){
BTNode<ElemType> *p;
p = Q.front ();
Q.pop ();
visit ( p->data );
if (p->lchild)
Q.push (p->lchild);
if (p->rchild)
Q.push (p->rchild);
}
}本回答被提问者采纳