資料結構–二叉樹–中序非遞迴遍曆二叉樹(鏈式結構)2

來源:互聯網
上載者:User

前一個為先判斷,條件允許再壓棧;這個為先壓棧再判斷,不合適退棧,先把左子樹的所有內容遍曆一遍並壓棧,然後判斷,直到為空白,再遍曆右子樹。

#define CHAR /* 字元型 */#include <stdio.h> /* EOF(=^Z或F6),NULL */#include <math.h> /* floor(),ceil(),abs() */#include <stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define STACK_INIT_SIZE 10 /* 儲存空間初始分配量 */#define STACKINCREMENT 2 /* 儲存空間分配增量 */typedef int Status; /* Status是函數的類型,其值是函數結果狀態碼,如OK等 */#ifdef CHARtypedef char TElemType;TElemType Nil=' '; /* 字元型以空格符為空白 */#endif#ifdef INTtypedef int TElemType;TElemType Nil=0; /* 整型以0為空白 */#endiftypedef struct BiTNode{TElemType data;struct BiTNode *lchild,*rchild; /* 左右孩子指標 */}BiTNode,*BiTree;typedef BiTree SElemType; /* 設棧元素為二叉樹的指標類型 */typedef struct SqStack{SElemType *base; /* 在棧構造之前和銷毀之後,base的值為NULL */SElemType *top; /* 棧頂指標 */int stacksize; /* 當前已指派的儲存空間,以元素為單位 */}SqStack; /* 順序棧 */Status InitBiTree(BiTree *T){ /* 操作結果: 構造空二叉樹T */*T=NULL;return OK;}void CreateBiTree(BiTree *T){TElemType ch;#ifdef CHARscanf("%c",&ch);#endif#ifdef INTscanf("%d",&ch);#endifif(ch==Nil) /* 空 */*T=NULL;else{*T=(BiTree)malloc(sizeof(BiTNode));if(!*T)exit(OVERFLOW);(*T)->data=ch; /* 產生根結點 */CreateBiTree(&(*T)->lchild); /* 構造左子樹 */CreateBiTree(&(*T)->rchild); /* 構造右子樹 */}}Status InitStack(SqStack *S){ /* 構造一個空棧S */(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!(*S).base)exit(OVERFLOW); /* 儲存分配失敗 */(*S).top=(*S).base;(*S).stacksize=STACK_INIT_SIZE;return OK;}Status StackEmpty(SqStack S){ /* 若棧S為空白棧,則返回TRUE,否則返回FALSE */if(S.top==S.base)return TRUE;elsereturn FALSE;}Status Push(SqStack *S,SElemType e){ /* 插入元素e為新的棧頂元素 */if((*S).top-(*S).base>=(*S).stacksize) /* 棧滿,追加儲存空間 */{(*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));if(!(*S).base)exit(OVERFLOW); /* 儲存分配失敗 */(*S).top=(*S).base+(*S).stacksize;(*S).stacksize+=STACKINCREMENT;}*((*S).top)++=e;return OK;}Status Pop(SqStack *S,SElemType *e){ /* 若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK;否則返回ERROR */if((*S).top==(*S).base)return ERROR;*e=*--(*S).top;return OK;}Status GetTop(SqStack S,SElemType *e){ /* 若棧不空,則用e返回S的棧頂元素,並返回OK;否則返回ERROR */if(S.top>S.base){*e=*(S.top-1);return OK;}elsereturn ERROR;}Status InOrderTraverse2(BiTree T,Status(*Visit)(TElemType))//先壓入,後判斷{ /* 採用二叉鏈表格儲存體結構,Visit是對資料元素操作的應用函數。*//* 中序遍曆二叉樹T的非遞迴演算法(利用棧),對每個資料元素調用函數Visit */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);if(!Visit(p->data))return ERROR;Push(&S,p->rchild);}}printf("\n");return OK;}Status visitT(TElemType e){#ifdef CHARprintf("%c ",e);#endif#ifdef INTprintf("%d ",e);#endifreturn OK;}void main(){BiTree T;InitBiTree(&T);#ifdef CHARprintf("請先序輸入二叉樹(如:ab三個空格表示a為根結點,b為左子樹的二叉樹)\n");#endif#ifdef INTprintf("請先序輸入二叉樹(如:1 2 0 0 0表示1為根結點,2為左子樹的二叉樹)\n");#endifCreateBiTree(&T);printf("中序非遞迴遍曆二叉樹(另一種方法):\n");InOrderTraverse2(T,visitT);}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.