C語言非遞迴實現二叉樹的先序、中序、後序遍曆,遞迴二叉樹

來源:互聯網
上載者:User

C語言非遞迴實現二叉樹的先序、中序、後序遍曆,遞迴二叉樹

#include <stdio.h>      #include <stdlib.h>      #define INIT_STACK_SIZE 100      #define STACKINCREMENT 10            //*****二叉樹的二叉鏈表格儲存體結構*****//  typedef struct BiNode      {          char data;          struct BiNode *lchild, *rchild;         int visitcount;                 //訪問次數(後序遍曆會用到)  }BiNode, *BiTree;            typedef struct      {          BiNode **base;          BiNode **top;          int stacksize;      }SqStack;        //*****初始化棧*****//     void InitStack(SqStack &S)                   {          if (!(S.base = (BiNode **)malloc(sizeof(BiTree) * INIT_STACK_SIZE)))          {              return;          }          S.top = S.base;          S.stacksize = INIT_STACK_SIZE;                return;      }            //*****元素進棧*****//  void Push(SqStack &S, BiNode *e)             {          if (S.top - S.base >= S.stacksize)          {              if (!(S.base = (BiNode **)realloc(S.base, sizeof(BiTree) * (STACKINCREMENT + S.stacksize))))            {                  return;              }              S.stacksize += STACKINCREMENT;          }          *S.top++ = e;                return;      }            //*****元素出棧*****//  void Pop(SqStack &S, BiNode **e)             {          if (S.base == S.top)          {              return;          }          *e = *--S.top;                return;      }        //*****取棧頂元素*****//      int GetTop(SqStack S, BiNode **e)      {          if (S.base == S.top)          {              return 0;          }          *e = *(S.top - 1);                    return 1;      }            //*****判斷棧是否為空白*****//    int StackEmpty(SqStack S)           {          if (S.top == S.base)              return 1;          else              return 0;      }        //*****按先序次序輸入二叉樹中結點的值(一個字元),空白字元表示空樹構造二叉鏈表表示的二叉樹T*****//      void CreateBiTree(BiTree &T)              {                                             char ch;            scanf("%c", &ch);            if(ch == ' ')            {                T = NULL;            }            else            {                if(!(T = (BiNode *)malloc(sizeof(BiNode))))                 {                    return;                }                T->data = ch;                    //產生根結點                CreateBiTree(T->lchild);     //構造左子樹                CreateBiTree(T->rchild);     //構造右子樹            }                      return;        }          //*****先序遍曆二叉樹方法1*****//   void PreorderTraverse_1(BiTree T)                         {        BiTree p;        SqStack S;        InitStack(S);        Push(S, T);                                         //根指標進棧        while(!StackEmpty(S))        {            while(GetTop(S, &p) && p)             {                                                               printf("%c ", p->data);                                      Push(S, p->lchild);             }            Pop(S, &p);                                     //null 指標退棧              if(!StackEmpty(S))            {                Pop(S, &p);                                 //根結點出棧                Push(S,p->rchild);                           //右孩子進棧            }        }              return;    }      //*****先序遍曆二叉樹方法2*****//   void PreorderTraverse_2(BiTree T)                           {          BiTree p = T;          SqStack S;          InitStack(S);                while (p || !StackEmpty(S))          {              if (p)              {                  printf("%c ", p->data);                Push(S,p);                  p = p->lchild;              }              else              {                  Pop(S, &p);                  p = p->rchild;              }          }      }     //*****中序遍曆二叉樹方法1*****//   void InOrderTraverse_1(BiTree T)                          {        SqStack S;        BiTree p;        InitStack(S);        Push(S,T);           while (!StackEmpty(S))        {            while (GetTop(S,&p) && p)              {                Push(S,p->lchild);                           //向左走到盡頭            }            Pop(S,&p);                                      //null 指標退棧              if (!StackEmpty(S))            {                  Pop(S,&p);                  printf("%c ", p->data);                Push(S,p->rchild);            }        }              return;    }      //*****中序遍曆二叉樹方法2*****//   void InOrderTraverse_2(BiTree T)                           {          BiTree p = T;          SqStack S;          InitStack(S);                while (p || !StackEmpty(S))          {              if (p)              {                  Push(S,p);                  p = p->lchild;              }              else              {                  Pop(S, &p);                  printf("%c ", p->data);                  p = p->rchild;              }          }               return;    }             //*****後序遍曆二叉樹*****//   void PostOrderTraverse(BiTree T)    {        SqStack S;        BiTree p = T;        InitStack(S);                while (p || !StackEmpty(S))        {            if(p)            {                if (p->visitcount != 2)                {                    p->visitcount = 1;                    Push(S, p);                }                p = p->lchild;            }            else             {                           Pop(S, &p);                  if(p->visitcount == 2)                {                    printf("%c ", p->data);                  }                else                 {                     p->visitcount++;                     Push(S, p);                }                p = p->rchild;            }        }                return;    }        int main(void)      {          BiTree T;          printf("請按先序次序輸入二叉樹中結點的值(字元),空白字元表示空樹:\n");      CreateBiTree(T);                printf("先序遍曆方法1結果為:");      PreorderTraverse_1(T);      printf("\n\n");         printf("先序遍曆方法2結果為:");      PreorderTraverse_2(T);      printf("\n\n");         printf("中序遍曆方法1結果為:");      InOrderTraverse_1(T);      printf("\n\n");             printf("中序遍曆方法2結果為:");      InOrderTraverse_2(T);      printf("\n\n");         printf("後序遍曆結果為:");      PostOrderTraverse(T);          printf("\n\n");                return 0;      }      

以如下二叉樹為例,給出按先序次序輸入二叉樹中結點的值(字元),從而按照本文給出的演算法構造二叉樹。


輸入字元的順序是:-+a空格空格*b空格空格-c空格空格d空格空格/e空格空格f空格空格,即可驗證本文給出的遍曆演算法。


建立一棵二叉樹,要分別用遞迴與非遞迴方法實現二叉樹的先序、中序與後序遍曆

我們的資料結構實驗也是這題,需要我把我的實驗報告給你參考下麼!
我這裡就只發這部分的代碼。
Status PreOrderTraverse(BiTree T)
{
//先序遍曆二叉樹T的遞迴演算法
if (T)
{
printf("%d ",T->data);
if(T->lchild) PreOrderTraverse(T->lchild);
if(T->rchild) PreOrderTraverse(T->rchild);
return FALSE;
}
elsereturn OK;
}
Status PreOrder(BiTree T)
{
//先序遍曆二叉樹T的非遞迴演算法
while(!(T==NULL&&top==NULL))
{
if(T)
{
printf("%d ",T->data);
push(T);
T=T->lchild;
}
else
{
T=(BiTree)pop();
T=T->rchild;
}
}
}
Status InOrderTraverse(BiTree T)
{
//中序遍曆二叉樹T的遞迴演算法
if (T)
{
if (T->lchild) InOrderTraverse(T->lchild);
printf("%d ",T->data);
if (T->rchild) InOrderTraverse(T->rchild);
return FALSE;
}
else return OK;
}
Status InOrder(BiTree T)
{
//中序遍曆二叉樹T的非遞迴演算法
while(!(T==NULL&&top==NULL))
{
while(T)
{
push(T);
T=T->lchild;
}
T=(BiTree)pop();
printf("%d ",T->data);
T=T->rchild;
}
}
Status PostOrderTraverse(BiTree T)
{
//後序遍曆二叉樹T的遞迴演算法
if (T)
{
if (T->lchild) PostOrderTraverse(T->lchild);
if (T->rchild) PostOrderTraverse(T->rchild);
printf("%d ",T->data);
return FALSE;
}
else return OK;
}
Status PostOrder(BiTree T)
{
//後序遍曆二叉樹T的遞迴演算法
unsigned sign;//記錄結點從棧中彈出的次數
while(!(T==NULL&&top==NULL))
{
if(T)
{
push(T);//第一次遇到結點T時壓入其指標
push(1);//置標誌為1
T=T->lchild;
}
else
{......餘下全文>>
 
資料結構實驗(用C語言)建立一棵二叉樹,並用遞迴或者非遞迴的演算法分別用先序中序與後序遍曆、

#define LEN sizeof(struct tree)
#define NULL 0
#include<stdio.h>
#include<malloc.h>
struct tree
{
char data;
struct tree *lchild,*rchild;
};
//建立二叉樹
struct tree *creat()
{
char c;
struct tree *t;
c=getchar();
if(c==' ')
t=NULL;
else
{
t=(struct tree*)malloc(LEN);
t->data=c;
t->lchild=creat();
t->rchild=creat();
}
return t;
}
//前序走訪
void Preprint(struct tree*t)
{
if(t!=NULL)
{
printf("%c->",t->data);
Preprint(t->lchild);
Preprint(t->rchild);
}
}
//中序遍曆
void Inprint(struct tree*t)
{
if(t!=NULL)
{
Inprint(t->lchild);
printf("%c->",t->data);
Inprint(t->rchild);
}
}
//後序遍曆
void Postprint(struct tree*t)
{
if(t!=NULL)
{
Postprint(t->lchild);
Postprint(t->rchild);
printf("%c->",t->data);
}
}
main()
{
struct tree *t;
printf("Please input tree in order:\n");
t=creat();
printf("The result of Preorder traversal is\n");
Preprint(t);
printf("^\nThe result of Inorder traversal is\n");
Inprint(t);
printf("^\nThe result of Postorder traversal is\n");
Postprint(t);
printf("^\n");
getch();
}...餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.