Example #1
0
File: c402.c Project: klimko/IAL
/**
 * Prechod stromom typu PostOrder implementovany nerekurzivne s vyuzitim funkcie
 * Leftmost_Postorder, zasobniku ukazovatelov a zasobniku hotdnot typu bool.
 * @param RootPtr - koren stromu
**/
void BTPostorder(tBTNodePtr RootPtr)
{
  if(RootPtr != NULL)
  {
    tStackP sp;
    tStackB sb;
    int val;
    tBTNodePtr temp = NULL;

    SInitP(&sp);
    SInitB(&sb);
    Leftmost_Postorder(RootPtr, &sp, &sb);

    while(!SEmptyP(&sp))
    {
      temp = STopPopP(&sp);
      //SPushP(&sp, temp);
      val = STopPopB(&sb);

      if(val != FALSE)
      {
        SPushP(&sp, temp); // Potrebovali sme len Top
        SPushB(&sb, FALSE);
        Leftmost_Postorder(temp->RPtr, &sp, &sb);
      }
      else
      {
        //STopPopP(&sp);
        BTWorkOut(temp);
      }
    }
  }
}
Example #2
0
void BTPostorder (tBTNodePtr RootPtr)	{
/*           -----------
** Prùchod stromem typu postorder implementovaný nerekurzivnì s vyu¾itím funkce
** Leftmost_Postorder, zásobníku ukazatelù a zásobníku hotdnot typu bool.
** Zpracování jednoho uzlu stromu realizujte jako volání funkce BTWorkOut().
**/
    tStackB stackB;
    tStackP stackP;
    SInitB(&stackB);
    SInitP(&stackP);
    Leftmost_Postorder(RootPtr, &stackP, &stackB);
    while (!SEmptyP(&stackP)) {
        RootPtr = STopPopP(&stackP);
        bool left = STopPopB(&stackB);
        if (left) {
            // Push back removed node
            SPushP(&stackP, RootPtr);
            SPushB(&stackB, FALSE);
            Leftmost_Postorder(RootPtr->RPtr, &stackP, &stackB);
        }
        else {
            BTWorkOut(RootPtr);
        }
    }
}
Example #3
0
void BTPostorder (tBTNodePtr RootPtr)	{
/*           -----------
** Prùchod stromem typu postorder implementovaný nerekurzivnì s vyu¾itím funkce
** Leftmost_Postorder, zásobníku ukazatelù a zásobníku hotdnot typu bool.
** Zpracování jednoho uzlu stromu realizujte jako volání funkce BTWorkOut(). 
**/
	
	if(!RootPtr)
	 	return;
	int l;
	tStackP stack;
	tStackB bstack;
	SInitP(&stack);
	SInitB(&bstack);
	tBTNodePtr aux  = RootPtr;
	Leftmost_Postorder (aux, &stack, &bstack);

	while(!SEmptyP(&stack))
	{
	  	aux = STopPopP(&stack);
	  	SPushP(&stack,aux);
	  	l = STopPopB(&bstack);
	  	if(l)
	  	{
	    		SPushB(&bstack,FALSE);
	    		Leftmost_Postorder(aux->RPtr, &stack, &bstack);
	  	}
	  	else
	  	{
	    		STopPopP(&stack);
	    		BTWorkOut(aux);
	  	}
	}
	
}