天天看點

二叉樹先序中序後序周遊遞歸和非遞歸算法

void PreOrder( BTNode *T)   //先序

{

if(T != NULL)

       {

printf("%c",T - > data);

PreOrder(T -> lchild);

PreOrder(T -> rchild);

}

}

void PreOrder( BTNode *T)   //先序 非遞歸

{ BTNode *p;

InitStack(s); //   初始化棧

p = T;  //p指向根節點

while(p || !StackEmpty(s))

{

if(p)

{

pop(S,p);  //将p壓棧

if(p != NULL )

{

                         printf("%c",p - > data);

}

p = p - > lchild;

}

else

{

pop(S,p);

p = p - >rchild;

}

}

}

void InOrder( BTNode *T)   //中序

{

if(T != NULL)

       {

InOrder(T -> lchild);

printf("%c",T - > data);

InOrder(T -> rchild);

}

}

void InOrder( BTNode *T)   //中序 非遞歸

{ BTNode *p;

InitStack(s); //   初始化棧

p = T;  //p指向根節點

while(p || !StackEmpty(s))

{

if(p)

{

pop(S,p);  //将p壓棧

p = p - > lchild;

}

else

{

pop(S,p);

if(p != NULL )

{

                        printf("%c",p - > data);

}

p = p - >rchild;

}

}

}

void PostOrder( BTNode *T)   //後序

{

if(T != NULL)

       {

PostOrder(T -> lchild);

PostOrder(T -> rchild);

printf("%c",T - > data);

}

}