遍历二叉树的各种操作(非递归遍历)(3)

/*
后序遍历由于遍历父节点是在遍历子节点之后,而且左节点和右节点遍历后的行为不一样,
所以需要用变量来记录前一次访问的节点,根据前一次节点和现在的节点的关系来确定具体执行什么操作
*/
void Postorder(BiTree T)
{
 if(T == NULL)
  return ;
 stack<BiTree> s;
 BiTree prev = NULL , curr = NULL;
 s.push(T);
 while(!s.empty())
 {
  curr = s.top();
  if(prev == NULL  || prev->lchild == curr || prev->rchild == curr)
  {
   if(curr->lchild != NULL)
    s.push(curr->lchild);
   else if(curr->rchild != NULL)
    s.push(curr->rchild);
  }
  else if(curr->lchild == prev)
  {
   if(curr->rchild != NULL)
    s.push(curr->rchild);
  }
  else
  {
   cout<<curr->data;
   s.pop();
  }
  prev = curr;
 }
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/146aaaa1ffcdbe3b773c769219592d02.html