二叉树遍历算法总结(递归与非递归)(3)

int Pop(SqStack *S,Datatype *ch)//出栈(字符栈)
{
    if(S->top < 0)
    {
        printf("栈为空....\n");
        return 0;
    }
    *ch = S->arr[S->top];
    S->top--;
    return 1;
}

int GetTopStack(SqStack S,Datatype *ch) //取字符栈顶
{
    if(S.top < 0)
    {
        return 0;
    }
    *ch = S.arr[S.top];
    return 1;
}

int EmptyStack(SqStack S) //判断栈空
{
    if(S.top < 0)
    {
        return 1;
    }
    return 0;
}

/******************************栈结束*********************************/

void CreateBitree(BiTree *T)  //前序创建二叉树
{
  char ch;
  scanf(" %c",&ch);
  getchar();
  if(ch == '#')
  {
      *T = NULL;
  }
  else
  {
    *T =(BiTree)malloc(sizeof(BiNode));
    (*T)->data = ch;
    CreateBitree(&((*T)->lchild));
    CreateBitree(&((*T)->rchild));
  }
}
   

void View(BiTree T)//非递归遍历  实现不同的遍历顺序修改第一个else语句的结点入栈顺序
{
    Datatype temp;
    BiTree p;
    temp.task = 1;
    temp.ptr = T;
    SqStack S;
    InitStack(&S);
    if(T == NULL) return ;
    Push(&S,temp);
    while(!EmptyStack(S))
    {
        Pop(&S,&temp);      //先把根出栈
        p = temp.ptr;          //记录根地址
        if(temp.task == 0)    //task为0  则访问输出
        {
            printf("%c ",temp.ptr->data);
        }
        else                        //task为1 则将孩子进栈
        {
            if(p->rchild)              //右孩子进栈
            {
                temp.task = 1;
                temp.ptr = p->rchild;
                Push(&S,temp);
            }
            temp.task = 0;          //根的状态由遍历改为访问,然后进栈
            temp.ptr = p;
            Push(&S,temp);
            if(p->lchild)              //左孩子进栈
            {
                temp.ptr = p->lchild;
                temp.task = 1;
                Push(&S,temp);
            }
        }
    }
    printf("\n");
}

int main()//二叉树创建:a b d # # e # # c f # # g # #
{
    BiTree T;
    CreateBitree(&T);
    printf("中序遍历为:");
    View(T);
    return 0;
}

三:层次遍历

    层次遍历需要使用队列

    算法思路比较结单,即对每个结点按左孩子,右孩子的顺序进队列即可,出队列时访问即为层次遍历。

    此处就不赘述算法思路步骤了,直接上代码。

void DispLayer(BiTree T) //层次遍历
{
    LinkQueue rear;                //装二叉树的结点地址的队列
    BiTree view = NULL;
    InitQueue(&rear);
    if(T == NULL)
    {
        return ;
    }
    EnQueue(&rear,T);              //先将总树根地址装进去
    while(!EmptyQueue(rear))    //队列为空则遍历完毕
    {
        DeQueue(&rear,&view);          //小树根出队列
        printf("%c ",view->data);          //输出小树根
        if(view->lchild)                          //小树根左右孩子存在则入队列
        {
            EnQueue(&rear,view->lchild);
        }
        if(view->rchild)
        {
            EnQueue(&rear,view->rchild);
        }
    }
    printf("\n");
}

以上即为二叉树的各种遍历算法。

二叉树遍历(图解) 

二叉树的常见问题及其解决程序

【递归】二叉树的先序建立及遍历

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f3c3609af955cbff8302940b75157b8a.html