标签:
附录:非递归算法代码例如以下:
void PreOrderTraverse_S(BiTree BT)//採用非递归方式先序遍历二叉树BT
{
BiTreep, stack[MAXSIZE];//p表示当前结点,栈stack[]用来存储结点
inttop = -1; //栈空
if(BT != NULL)//先推断是否为空树
{
p = BT;
while (p || top >= 0)
{
if (p != NULL) //先输出结点数据,再遍历左孩子
{
printf("%c",p->data);//输出该结点
stack[++top] = p;
p = p->lchild;
}
else
{
p = stack[top--]->rchild; //訪问栈顶元素右孩子,并退栈
}
}
}
}
void InOrderTraverse_S(BiTree BT)//採用非递归方式中序遍历二叉树BT
{
BiTreep, stack[MAXSIZE];//p表示当前结点,栈stack[]用来存储结点
inttop = -1; //栈空
if(BT != NULL)//先推断是否为空树
{
p = BT;
while (p || top >= 0)
{
if (p != NULL)//首先訪问左子树
{
stack[++top] = p;
p = p->lchild;
}
else
{
printf("%c",stack[top]->data);//输出栈顶元素
p = stack[top--]->rchild; //訪问栈顶元素右孩子,并退栈
}
}
}
}
void PostOrderTraverse_S(BiTree BT)//採用非递归方式后序遍历二叉树BT
{
BiTreep, stack[MAXSIZE];//p表示当前结点,栈stack[]用来存储结点
inttag[MAXSIZE] = {0}; //用来标志栈顶元素的右孩子是否被訪问过,0表示未訪问,1表示已訪问
inttop = -1; //栈空
if(BT != NULL)//先推断是否为空树
{
p = BT;
while (p || top >= 0)
{
if (p != NULL) //首先訪问左子树
{
stack[++top] = p;
tag[top] = 0;
p = p->lchild;
}
else if (tag[top] == 0) //若右子树尚未訪问,訪问栈顶元素右孩子,并做好标记
{
p= stack[top]->rchild;
tag[top]= 1;
}
else//否则输出栈顶元素并退栈
{
printf("%c",stack[top--]->data);
}
}
}
}
标签:
原文地址:http://www.cnblogs.com/gcczhongduan/p/4279268.html