前序排列的非递归实现:
Template<class T>
Void PreOrder(BinaryTreeNode<T> *t)
{
stack <BinaryTreeNode<T> *> S(Maxlength);
BinaryTreeNode<T> *p=t;
do{
while(p){
visit(p);//访问P
S.Add(p);
p=p->LeftChild;
}
If(!S.IsEmpty()){
S.Delete(p);
p=p->RightChild;
}
}while(p||!S.IsEmpty())
}
中序排列的非递归实现:
template<class T>
void InOrder(BinaryTreeNode<T> *t) //对*t进行中序遍历
{ stack <BinaryTreeNode<T> *> S(MaxLength);
BinaryTreeNode<T> *p=t ;
do {
while (p)
{S.Add(p); p=p->LeftChild;}
if (!S.IsEmpty())
{S.Delete(p);
Visit(p);
p=p->RightChild;
}
} while (p||!S.IsEmpty())
}
后续排列的非递归实现:
template<class T>
void BinaryTree<T>::PostOrder1(void(*Visit)(BinaryTreeNode<T> *u),BinaryTreeNode<T> *t)
{ int flag;
stack<int> flagStack; //存放标志位的栈,每出(入)一个节点指针,同步出(入)一个标志位
stack <BinaryTreeNode<T> *> S;
BinaryTreeNode<T> *p=t ;
do {
while (p)
{S.push(p);
flagStack.push(1);
p=p->LeftChild;}
if (!S.empty())
{ p=S.top();
flag=flagStack.top();
if(p->RightChild&&flag==1){
flagStack.pop();
flagStack.push(2);
p=p->RightChild;
}
else{ S.pop();
flagStack.pop();
Visit(p);
p=0;
}
}
} while (p||!S.empty()) ;
}