//非递归中序遍历
Status InOrderTraversal(BiTree BT)
{
BiTree T = BT;
NumStack *stack = createStack();
//栈不为空或者树不为空就要继续遍历
while (T!=NULL || !isempty(stack))
{
//先遍历左子树,把左子树压入栈中
while (T!=NULL)
{
pushStack(stack,T);
T = T->lchild;
}
if (!isempty(stack))
{
NumStackPtr node = popStack(stack);
T = node->T;
printf("%c ", T->data);
T = T->rchild;
}
}
return SUCEESS;
}
//后序遍历
Status TraverseAfter(BiTree B)
{
BiTree T = B;
//用来记住上一个节点
BiTree pre = NULL;
NumStack *stack = createStack();
//栈不为空或者树不为空就要继续遍历
while (T != NULL || stack->top!=NULL)
{
//先遍历左子树,把左子树压入栈中
while (T != NULL)
{
pushStack(stack, T);
T = T->lchild;
}
//把原来的改成循环
NumStackPtr pop = popStack(stack);
T = pop->T;
//上次弹出来的是右节点,已经弹出来了就把他给记住,不用再去遍历他
if (T->rchild == pre || T->rchild == NULL)
{
printf("%c ",T->data);
pre = T;
//这里把它置空的原因是右子树已经遍历完了,如果不空,就会在上面的第二个while循环又进来一次
T = NULL;
}
else
{
pushStack(stack, T);
T = T->rchild;
}
}
return SUCEESS;
}
//非递归层序遍历
void levelTraverse(BiTree B)
{
BiTree T = B;
if (B == NULL)
{
return;
}
//初始化队列
Queue *que = QueueInit();
insertQueue(que,T);
/*
队列从左到右进行遍历
*/
while (que->front!=NULL)
{
BiTree node = outQueue(que);
printf("%c ",node->data);
if (node->lchild)insertQueue(que, node->lchild);
if (node->rchild)insertQueue(que, node->rchild);
}
}
非递归的三种遍历
最新推荐文章于 2022-02-23 22:35:04 发布