二叉树--实现二叉树的前序/中序/后序非递归遍历。

来源:互联网 发布:阿儿法营编程学校 编辑:程序博客网 时间:2024/06/05 15:26

思路:都用到栈,用栈来存储结点

//先序非递归,根左右,循环处理,先打印根再压左子树,再压右子树void PreOrder_Nor(BinaryTreeNode<T>* pRoot){     if(pRoot == NULL)          return ;     stack<BinaryTreeNode<T>*> s;     s.push(pRoot);     while(!s.empty())     {          BinaryTreeNode<T>* pCur = s.top();          cout<<pCur -> data << "  ";          s.pop();          if(pCur -> left)                s.push(pCur->left);           if(pCur -> right)                s.push(pCur -> right);           }}
//中序非递归,左根右,一样是循环,这次要一直压入左,然后逐个向上遍历根和右void InOrder_Nor(BinaryTreeNode<T>* pRoot){      if(pRoot == NULL)          return ;     stack<BinaryTreeNode<T>*>s;     BinaryTreeNode<T>* pCur = pRoot;     while(pCur != NULL || !s.empty() )     {          while(pCur)          {               s.push(pCur);               pCur = pCur -> left;          }          BinaryTreeNode<T>* pTop = s.top();          cout<< pTop -> data << "  ";          s.pop();          pCur = pTop -> right;     }}
//后序遍历非递归//左右根,当右为空或者右子树遍历完的时候才会遍历根节点,所以这里需要新给一个pRev结点。void PostOrder_Nor(BinaryTreeNode<T>* pRoot){     if(pRoot == NULL)          return ;     stack<BinaryTreeNode<T>*>s;     BinaryTreeNode<T>* pRev = NULL;     BinaryTreeNode<T>* pCur = pRoot;     while(NULL != pCur || !s.empty())     {          while(pCur)          {               s.push(pCur);               pCur = pCur -> left;          }          BinaryTreeNode<T>* pTop = s.top();                    if(pTop -> right == NULL || pTop -> right == pRev)          {               cout<<pTop->data<< "  ";               pRev = pTop;               s.pop();          }          else               pCur = pTop -> right;     }}
阅读全文
0 0
原创粉丝点击