C++用非递归实现二叉树的前序排列,中序排列,后续排列

时间:2022-05-10 17:30:45
前序排列的非递归实现:
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()) ;
      }