林晓倩吧 关注:59贴子:2,756

★数据结构——二叉树的递归遍历和非递归遍历

只看楼主收藏回复



1楼2010-05-30 21:15回复
    工程:Win32 Console Application
    BiTreeTraverse.h
    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    #include <process.h>
    //-----常量定义-----
    #define STACK_INIT_SIZE   100
    #define STACKINCREMENT    10
    #define MAX_TREE_SIZE     100
    #define OK                1
    #define ERROR             0
    #define OVERFLOW          -2
    //-----函数返回值类型定义-----
    typedef int   Status;
    typedef char TElemType;
    typedef enum{L,R} Tag;
    typedef struct BiTNode
    {
         TElemType data;
         Tag tag;
         struct BiTNode *lchild,*rchild;
    }BiTNode,*BiTree;
    typedef struct
    {
         BiTree   *base;
         BiTree   *top;
         int   stacksize;
    }SqStack;
    //-----基本操作的函数原型说明-----
    Status CreateBiTree(BiTree &T);//按先序遍历方法递归建立一棵二叉树
    Status Visit(TElemType e);//访问结点元素,将其值输出
    Status PreOrderTraverse1(BiTree T,Status(* Visit)(TElemType e));//先序遍历递归算法
    Status PreOrderTraverse2(BiTree T,Status(* Visit)(TElemType e));//先序遍历非递归算法
    Status InOrderTraverse1(BiTree T,Status(* Visit)(TElemType e));//中序遍历递归算法
    Status InOrderTraverse2(BiTree T,Status(* Visit)(TElemType e));//中序遍历非递归算法
    Status PostOrderTraverse1(BiTree T,Status(* Visit)(TElemType e));//后序遍历递归算法
    Status PostOrderTraverse2(BiTree T,Status(* Visit)(TElemType e));//后序遍历非递归算法
    Status Pop(SqStack &S,BiTNode *&T);//非递归算法中所用的出栈操作
    Status InitStack(SqStack &S);//非递归算法中所用的初始化栈操作
    Status Push(SqStack &S,BiTNode *T);//非递归算法中所用的入栈操作
    Status StackEmpty(SqStack S);//非递归算法中所用的判断栈空操作
    


    2楼2010-05-30 21:17
    回复
        偶一直都是三续联合遍历的。以及“typedef enum{L,R} Tag;”行不行啊?(重装了gcc还没装回来)


      4楼2010-05-30 21:27
      回复
        回复:4楼
        当然是可以的,我发布的代码全部都是经过测试,可以运行并进行相应的操作,哎,度娘审核,把我的BiTreeTraverse.cpp给隐藏了,估计明天就出来了。。。。。。


        5楼2010-05-30 21:33
        回复
          关于*和&以及它们的引用混在一起的问题,头脑里还是有点乱


          6楼2010-05-30 21:35
          回复
              典型的右左法则问题么?enum偶还没用过,typedef也是。还不懂为什么一般都不用
            struct BiTNode
            {
            而要用
            typedef struct BiTNode
            {


            7楼2010-05-30 21:39
            回复
                             Pop(S,p);
                             p=p->rchild;
                           }
                     }       
                     return OK;
              }
              Status InOrderTraverse1(BiTree T,Status(* Visit)(TElemType e))//中序遍历递归算法
              {
                     if(T)
                     {
                         if(InOrderTraverse1(T->lchild,Visit))
                             if(Visit(T->data))
                                 if(InOrderTraverse1(T->rchild ,Visit)) return OK;
                         return ERROR;
                     }else return OK;
              }
              Status InOrderTraverse2(BiTree T,Status(* Visit)(TElemType e))//中序遍历非递归算法
              {   
                   SqStack S;
                   InitStack(S);
                   BiTNode *p;
                   p=T;
                    while (p || !StackEmpty(S))
                    {
                      if(p)
                         {
                           Push(S,p);
                           p=p->lchild;
                         }
                      else
                          {   
                           Pop(S,p);
                           if(!Visit(p->data))
                              return ERROR;
                           p=p->rchild;  
                         }
                     }
                    return OK;
              }
                 
              Status PostOrderTraverse1(BiTree T,Status(* Visit)(TElemType e))//后序遍历递归算法
              {
                     if(T)
                     {
                         if(PostOrderTraverse1(T->lchild,Visit))
                             if(PostOrderTraverse1(T->rchild ,Visit))
                                 if(Visit(T->data)) return OK;
              


              9楼2010-05-30 21:50
              回复
                           return ERROR;
                       }else return OK;
                }
                Status PostOrderTraverse2(BiTree T,Status(* Visit)(TElemType e))//后序遍历非递归算法
                {  
                if (T)
                     {   
                         SqStack S;
                         InitStack(S);
                         BiTNode *p;
                         p=T;
                         Push(S,NULL);
                         while (p||!StackEmpty(S))
                               {
                                while (p)
                                      {
                                       p->tag=L;
                                       Push(S,p);
                                       p=p->lchild;
                                      }
                                Pop(S,p);
                                while (p&&(p->tag==R))
                                     {  
                                      if(!Visit(p->data))
                                         return ERROR;  
                                      Pop(S,p);
                                     }
                                if (p)
                                   {
                                       p->tag=R;
                                    Push(S,p);  
                                    p=p->rchild;  
                                   }
                              }
                        
                         return OK;
                        
                    }  
                else
                      return ERROR;
                }
                Status InitStack(SqStack &S)//非递归算法中所用的栈初始化操作
                {
                S.base=(struct BiTNode   * *)malloc(STACK_INIT_SIZE*sizeof(struct BiTNode * ));
                if(!S.base)
                     return ERROR;
                S.top=S.base;
                S.stacksize=STACK_INIT_SIZE;
                return OK;
                }
                Status Push(SqStack &S,BiTree T)//非递归算法中所用的入栈操作
                {
                if(S.top-S.base>=S.stacksize)
                {
                S.base=(struct BiTNode * *)realloc(S.base,(STACKINCREMENT+S.stacksize)*sizeof(struct BiTNode * ));
                if(!S.base)
                     return ERROR;
                S.top=S.base+S.stacksize;
                S.stacksize+=STACKINCREMENT;}
                *S.top++=T;
                return OK;
                }
                Status Pop(SqStack &S,BiTNode *&T)//非递归算法中所用的出栈操作
                {
                if(S.top==S.base)
                     return ERROR;
                T=*--S.top;
                return OK;
                }
                Status StackEmpty(SqStack S)//非递归算法中所用的判断栈空操作
                {
                if (S.top==S.base)
                      return OK;
                else
                      return ERROR;
                }
                


                10楼2010-05-30 21:50
                回复
                  回复:7楼
                  同不懂,不过,我估计是用typedef可以把一些不明的或者复杂的结构隐藏起来,使代码统一,简单化⑧,(⊙o⊙)…我就是随便说说。。。。。。


                  14楼2010-05-30 21:50
                  回复
                      审出来了,华丽。


                    15楼2010-05-30 21:53
                    回复
                      TraverseDemo.cpp
                      #include "BiTreeTraverse.h"
                      TElemType a[MAX_TREE_SIZE];
                      void main()
                      {
                           BiTree T;
                           printf("请按先序次序输入二叉树中结点的值(一个字符),若某结点为空,请用'#'来表示。\n\n");
                           printf("创建二叉树:\n");
                           CreateBiTree(T);
                           printf("\n");
                           printf("先序递归算法遍历结果:\n");
                           PreOrderTraverse1(T, Visit);
                           putchar('\n');
                           printf("先序非递归算法遍历结果:\n");
                           PreOrderTraverse2(T, Visit);
                           putchar('\n');
                           printf("中序递归算法遍历结果:\n");
                           InOrderTraverse1(T, Visit);
                           putchar('\n');
                           printf("中序非递归算法遍历结果:\n");
                           InOrderTraverse2(T, Visit);
                           putchar('\n');
                           printf("后序递归算法遍历结果:\n");
                           PostOrderTraverse1(T, Visit);
                           putchar('\n');
                           printf("后序非递归算法遍历结果:\n");
                           PostOrderTraverse2(T, Visit);
                           putchar('\n');
                      }


                      16楼2010-05-30 21:55
                      回复
                          引用类型C没有的吧,看你的代码应该是追求C的吧。


                        18楼2010-05-30 22:02
                        回复
                          我们学的是C语言版的数据结构,当然用的是C语言
                          如果没有引用的话这个*&T和T就是等价的,但是如果把*&T换成T的话,就出错了。。。
                          Status Pop(SqStack &S,BiTNode *&T);//非递归算法中所用的出栈操作
                          Status Pop(SqStack &S,BiTNode *&T)//非递归算法中所用的出栈操作
                          {
                          if(S.top==S.base)
                                return ERROR;
                          T=*--S.top;
                          return OK;
                          }
                          


                          19楼2010-05-30 22:05
                          回复
                            C和C++都有引用类型,这个我那天我和小玉讨论的时候,我专门把C和C++的教材都翻出来了,书上面写的明明白白,都有


                            20楼2010-05-30 22:06
                            回复
                                这样啊,偶看一下ANSI。


                              21楼2010-05-30 22:08
                              回复