template <class TElem>
long TBinTree<TElem>::Cluster2(TBinTreeNode0<TElem>* pNode, TBinTreeNode0<TElem> **pNodes,TTraverseMode tm)
{
long cnt=0;
long nNodes;
long top=0;
TBinTreeNode<TElem>** sk;
TBinTreeNode<TElem>* p;
nNodes=GetHeight(pNode);
if (nNodes<=0) return 0;
switch (tm)
{
case PreOrder:
sk =new TBinTreeNode<TElem> *[nNodes+1];
if (sk==NULL) throw TExcepComm(3);
p =(TBinTreeNode<TElem> *) pNode;
while (p!=NULL || top!=0)
{
if (p!=NULL)
{
pNodes[cnt++]= p;
top++; sk[top]=p;
p = (TBinTreeNode<TElem> *)p->GetSon(1);
}
else
{
p = sk[top]; top--;
p = (TBinTreeNode<TElem> *)p->GetSon(2);
}
} //while
delete[] sk;
break;
case InOrder:
sk =new TBinTreeNode<TElem> *[nNodes+1];
if (sk==NULL) throw TExcepComm(3);
p =(TBinTreeNode<TElem> *) pNode;
while (p!=NULL || top!=0)
{
if (p!=NULL)
{
top++; sk[top]=p;
p = (TBinTreeNode<TElem> *)p->GetSon(1);
}
else
{
p = sk[top]; top--;
pNodes[cnt++]= p;
p = (TBinTreeNode<TElem> *)p->GetSon(2);
}
} //while
delete[] sk;
break;
sk2 =new TPostTraverseStackNode [nNodes+1];
if (sk2==NULL) throw TExcepComm(3);
p =(TBinTreeNode<TElem> *) pNode;
while (p!=NULL || top!=0)
{
if (p!=NULL)
{
top++;
sk2[top].pNode=p;
sk2[top].isFirst = 1;
p = (TBinTreeNode<TElem> *)p->GetSon(1);
}
else
if (sk2[top].isFirst)
{
sk2[top].isFirst = 0;
p = (TBinTreeNode<TElem> *)(sk2[top].pNode->GetSon(2));
}
else
{
p = sk2[top].pNode;
top--;
pNodes[cnt++]= p;
p=NULL;
}
} //while
delete [] sk2;
break;
}
return cnt;
}
template <class TElem>
long TBinTree<TElem>::ClusterDescendants(TBinTreeNode0<TElem>* pNode,
TBinTreeNode0<TElem>** pNodes,
TTraverseMode tm,
int startLevel,
int endLevel)
{
long cnt=0, levelNo=0;
long nNodes;
long top=0;
TBinTreeNode<TElem>* p;
rt =(TBinTreeNode<TElem>*) GetRoot();
hei=GetHeight(rt);
if (hei<=0) return 0;
sk2 =new TTraverseStackNode[hei+1];
if (sk2==NULL) throw TExcepComm(3);
p = rt;
top=0;
while (p!=NULL || top!=0)
{
if (p!=NULL)
{
top++;
sk2[top].pNode=p;
sk2[top].isFirst = 1;
if (p==pNode) break;
p = (TBinTreeNode<TElem> *)p->GetSon(1);
}
else
if (sk2[top].isFirst)
{
sk2[top].isFirst = 0;
p = (TBinTreeNode<TElem> *)(sk2[top].pNode->GetSon(2));
}
else
{
p = sk2[top].pNode;
top--;
p=NULL;
}
} //while
for (long i=1; i<=top; i++)
e[i-1]=&(sk2.pNode->GetElem());
delete [] sk2;
return top;
}
template <class TElem>
long TBinTree<TElem>::ClusterJuniors(TBinTreeNode0<TElem>* pNode,
TBinTreeNode0<TElem> **pe,
TTraverseMode tm,
int startLevel,
int endLevel)
{
long levelNo, hei;
template <class TElem>
long TBinTree<TElem>::ClusterSeniors(TBinTreeNode0<TElem>* pNode,TBinTreeNode0<TElem> **pe,TTraverseMode tm,
int startLevel, int endLevel)
{
long levelNo, hei;
template <class TElem>
TBinTreeNode0<TElem> *TBinTree<TElem>:ocate(TBinTreeNode0<TElem>* pNode,TElem *e)
{
TBinTreeNode0<TElem> *p;
if (pNode==NULL) return NULL;
if (pNode->GetElem()==*e) return pNode;
p =Locate(pNode->GetSon(1), e);
if (p!=NULL) return p;
return Locate(pNode->GetSon(2), e);
}
template <class TElem>
TBinTreeNode0<TElem> *TBinTree<TElem>img]images/smile/5.gif[/img]nPreToTree(TElem *pa, TElem *ia,
long p1, long p2, long i1, long i2)
{
long k;
TBinTreeNode<TElem> *p;
cout<<"\nTotal number of nodes:"<<t1.GetNumSubNodes(t1.GetRoot());
cout<<"\nTotal number of leaves:"<<t1.GetNumLeaves(t1.GetRoot());
cout<<"\nHeight: "<<t1.GetHeight(t1.GetRoot());
TBinTreeNode<int>* pNodes[10], *p;
int n, i;
int **es;