二叉树 前中后序遍历非递归版本 C++实现

来源:互联网 发布:改之理 源码 编辑:程序博客网 时间:2024/05/16 19:28

RT。

//前序排列的非递归实现:     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(BinaryTreeNode<T> *t)   {   int mark;       stack<int> markStack; //标志位       stack  <BinaryTreeNode<T> *>   S;       BinaryTreeNode<T> *p=t ;     do {          while (p)          {              S.push(p);                markStack.push(1);                 p=p->LeftChild;         }            if (!S.empty())             {   p=S.top();                 mark=markStack.top();                  if(p->RightChild&&mark==1){                      markStack.pop();                      markStack.push(2);  //右子树                    p=p->RightChild;                      }                  else{ S.pop();                        markStack.pop();                        Visit(p);                        p=0;                      }             }        } while (p||!S.empty()) ;        }  

/////

0 0
原创粉丝点击