二叉树的非递归遍历总结

一、前序遍历

思路:从根节点开始遍历,对于当前节点,如果不为空,先访问并放到栈中,然后将其置为左子结点;如果为空,从栈中取出一个节点p,并将当前节点置为p->right。结束条件为当前节点和栈都为空。

void preOrderTraverse(BiTreeNode *biTree, void (visit *)(int v)) {
     BiTreeNode *p = biTree;
     stack my_stack;
     while(p!=NULL || !my_stack.empty()) 
     {
         if(p!=NULL) {
             visit(p->val); 
              my_stack.push(p);
              p = p->left;
          }
          else {
              p = my_stack.top()->right;
              my_stack.pop();
          }
      }
}

二、中序遍历

思路:从根节点开始遍历,对于当前节点,如果不为空,放入栈,将其置为左子结点;如果为空,从栈中取出一个节点p,访问节点,并将当前节点置为p->right。结束条件为当前节点和栈都为空。

void inOrderTraverse(BiTreeNode *biTree, void (visit *)(int v)) {
     BiTreeNode *p = biTree;
     stack my_stack;
     while(p!=NULL || !my_stack.empty()) 
     {         
          if(p!=NULL) {
               my_stack.push(p);
               p=p->left;
          }
          else {
               BiTreeNode *q = my_stack.top();   my_stack.pop();
               visit(q);
               p = q->right;
           }
      }

}

三、后续遍历

思路:现将根节点加入栈中,从栈中取出节点,如果当前节点没有孩子节点或者孩子节点已被访问,则访问节点;否则将右子节点入栈,再将左子节点入栈。直到栈为空。

void postOrder3(BinTree *root)     //非递归后序遍历
{
    stack s;
    BinTree *cur;                      //当前结点 
    BinTree *pre=NULL;                 //前一次访问的结点 
    s.push(root);
    while(!s.empty())
    {
        cur=s.top();
        if((cur->lchild==NULL&&cur->rchild==NULL)||
           (pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))
        {
            cout<data<<" ";  //如果当前结点没有孩子结点或者孩子节点都已被访问过 
              s.pop();
            pre=cur; 
        }
        else
        {
            if(cur->rchild!=NULL)
                s.push(cur->rchild);
            if(cur->lchild!=NULL)    
                s.push(cur->lchild);
        }
    }    
}


你可能感兴趣的:(algorithm)