• 二叉树的递归与非递归


    二叉树的递归和非递归算法:

                      (做这个的时候,总是逻辑跟不上,会搞混,做的时候发现自己对结构体指针的使用有些糊涂。)

    代码如下:

    #include <stdio.h>

    #include <stdlib.h>

    #define  Max 100

    typedef struct Node

    {

      char Date;

      struct Node *Lchild;   //左孩子

      struct Node *Rchild;   //右孩子

    }BiNode,*BiTree;

    typedef struct    //树类型的结构体,顺序存储

    {

       BiTree date[Max];      

       int top;                 //控制栈顶

    }SeqStack,*PseqStack;

                                                             

    void CreatTree( BiTree *root)         ////递归方式创建二叉树

    {                                                       

             char f;                                             

             f=getchar();                                       

             if(f=='.')     //用.来代替孩子是空的情况                                     

                       *root=NULL;                                    

             else                                               

             {                                                  

                       *root=(BiTree)malloc(sizeof(BiNode));  //分配空间        

                      (*root)->Date=f;                                       

                 CreatTree(&((*root)->Lchild));                 

                       CreatTree(&((*root)->Rchild));                 

             }                                                  

                                                                 

    }                

    //递归

    void Visit(char Date)

    {

             printf("%c ",Date);

    }

                                                    

    void PreOrder(BiTree root)                                  //  先序遍历

    {                                                          

             if(root)                                              

             {                                                     

                       Visit(root->Date);                                 

                       PreOrder(root->Lchild);                            

                 PreOrder(root->Rchild);                            

             }                                                      

    }                                                          

                                                            

    void InOrder(BiTree root)                                  // 中序遍历

    {                                                         

             if(root)                                               

             {                                                      

                  InOrder(root->Lchild);                            

                       Visit(root->Date);                                 

                 InOrder(root->Rchild);                            

             }                                                     

    }                                                           

                                                               

    void PostOrder(BiTree root)                                 //  后序遍历

    {                                                         

             if(root)                                                

             {                                                      

                       PostOrder(root->Lchild);                           

                 PostOrder(root->Rchild);                           

                       Visit(root->Date);                                                        

             }                                                      

    }                                                          

    //非递归

    PseqStack Init_SeqStack()

    {

       PseqStack S;

       S=(PseqStack)malloc(sizeof(SeqStack));

       S->top=-1;

       return S;

    }

    int IsEmpty(PseqStack S)   //判空

    {

      if(S->top==-1)

       return 1;

    else

      return 0;

    }

    int  Push(PseqStack S,BiTree x) //进栈

    {

       if(S->top==Max-1)

         return 0;

       else

         S->top++;

         S->date[S->top]=x;

         return 1;

    }

    BiTree Pop(PseqStack S)    //出栈

    {

               if (!IsEmpty(S))

                          return S->date[S->top--];

    }

    void PreOrder1(BiTree root)         //非递归先序

    {

        PseqStack S;

             BiTree p;

             p=root;

             S=Init_SeqStack();

             while(p!=NULL||!IsEmpty(S))    //当树不是空树或栈不是空

             {

                       while(p!=NULL)         //当树不是空树时

                       {

                                Visit(p->Date);     //访问根节点的元素

                                Push(S,p);         //将这个节点压入栈

                                p=p->Lchild;        //然后是左孩子,一直循环,按先序的方式。

                       }

                       if(!IsEmpty(S))        //栈不是空的,出栈,然后是右孩子。

                       {

                                p=Pop(S);

                                p=p->Rchild;

                       }

             }

    }

    void InOrder1(BiTree root)             //非递归中须。

    {

        PseqStack S;

             BiTree p;

             p=root;

             S=Init_SeqStack();

             while(p!=NULL||!IsEmpty(S))

             {

                       while(p!=NULL)

                       {

                      

                                Push(S,p);

                                p=p->Lchild;

                       }

                       if(!IsEmpty(S))

                       {

                                p=Pop(S);

                                Visit(p->Date);

                                p=p->Rchild;

                       }

             }

    }

    void PrintTree(BiTree Root,int n)  //输出图形

    {

        int i;

        if(Root==NULL) return; //空树

        PrintTree(Root->Rchild,n+1);

        for(i=0;i<n;i++)   //控制空格

        printf("  ");

        printf("%c ",Root->Date);

        PrintTree(Root->Lchild,n+1);

    }

    int main (void)

    {

             BiTree Root;

             int n=0;

             printf("please input the bitree: ");

             CreatTree(&Root);

             printf("the preorder bitree is  ");

             PreOrder(Root);

        printf(" the InOrder bitree is  ");

             InOrder(Root);

             printf(" the PostOrder bitree is  ");

             PostOrder(Root);

             printf(" the non-recursive tree is (preorder) ");

        PreOrder1(Root);

             printf(" the non-recursive tree is (inorder) ");

        InOrder1(Root);

             printf(" the picture of bitree is : ");

             PrintTree(Root,n);

             getch();

             return 0;

    }

                                                                  By:暖暖

                                                                 2014.11.19

  • 相关阅读:
    [USACO11JAN]Roads and Planes G【缩点+Dij+拓补排序】
    Cheatsheet: 2015 05.01 ~ 05.31
    Cheatsheet: 2015 04.01 ~ 04.30
    Cheatsheet: 2015 03.01 ~ 03.31
    Cheatsheet: 2015.02.01 ~ 02.28
    Cheatsheet: 2015 01.01~ 01.31
    Cheatsheet: 2014 12.01 ~ 12.31
    Cheatsheet: 2014 11.01 ~ 11.30
    Cheatsheet: 2014 10.01 ~ 10.30
    Cheatsheet: 2014 09.01 ~ 09.30
  • 原文地址:https://www.cnblogs.com/2714585551summer/p/4108812.html
Copyright © 2020-2023  润新知