数据结构——树的非递归遍历算法
原理:递归程序都可以改为栈结构。
1、二叉树的非递归前序遍历:根节点先访问,后入栈。
void new_PreOrder(BiTreeNode *t, void visit(DataType item))
{
B_stack Stack;
BiTreeNode *agent = t;
Init_Stack(&Stack);
if(agent!=NULL)
{
Stack_push(&Stack,&agent);
//printf("t = %p ,agent = %p\n",t,agent);
}
do{
visit(agent->data);
//printf("\n");
if(agent->leftChild != NULL)
{
agent = agent->leftChild;
Stack_push(&Stack,&agent);
}else
{
do{
Stack_pop(&Stack,agent);
}while((Stack.base != Stack.top) && agent->rightChild == NULL);
if(agent->rightChild != NULL)
{
agent = agent->rightChild;
Stack_push(&Stack,&agent);
}
}
}while(Stack.base != Stack.top);
}
2、二叉树的非递归中序遍历算法:结点在出栈时才访问。
问题: 但是当访问完右子树后,会出根节点,从而导致在未完全遍历时,提前出现空栈。
解决方法:内循环之后出栈之后,进行单独处理。
void new_InOrder(BiTreeNode *t, void visit(DataType item)) /*使用栈结构完成树的中序遍历*/
{
/*结尾处理不正确,导致出现了死循环*/
b_Stack T_Stack;
Inita_Stack(&T_Stack);
BiTree_Node agent = t;
BiTreeNode temp;
do{
if(agent!= NULL)
{
Stack_push(&T_Stack,&agent);
agent = agent->leftChild;
}else
{
Stack_pop(&T_Stack,&temp);
agent = &temp;
visit(agent->data);
if(agent->rightChild != NULL)
{
agent= agent->rightChild;
}else
{
do{
if(T_Stack.base == T_Stack.top)
{
break;
}
Stack_pop(&T_Stack,&temp);
agent = &temp;
visit(agent->data);
}while(agent->rightChild == NULL);
if(agent->rightChild != NULL)
{
agent = agent->rightChild;
Stack_push(&T_Stack,&agent);
agent = agent->leftChild;
}
}
}
}while(T_Stack.base != T_Stack.top);

浙公网安备 33010602011771号