数据结构——树的非递归遍历算法

原理:递归程序都可以改为栈结构。

 

 

 

 

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);

  

 

posted @ 2018-12-04 12:48  怪兽不纯粹  阅读(237)  评论(0)    收藏  举报