国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言非遞歸后序遍歷二叉樹

2020-01-26 13:52:16
字體:
供稿:網(wǎng)友

本文實例為大家分享了C語言非遞歸后序遍歷二叉樹的具體代碼,供大家參考,具體內(nèi)容如下

法一:實現(xiàn)思路:一個棧 先按 根->右子樹->左子樹的順序訪問二叉樹。訪問時不輸出。另一個棧存入前一個棧只進棧的結(jié)點。
最后輸出后一個棧的結(jié)點數(shù)據(jù)。

#include<stdio.h>#include<stdlib.h>typedef struct TreeNode{  char element;  struct TreeNode *left,*right;}Tree,*BTree;typedef struct StackNode{  BTree data;  struct StackNode *next;}Stack,*PStack;typedef struct{  PStack top; }LinkStack,*PLinkStack;//初始化空棧PLinkStack Init_Stack(void){  PLinkStack S;  S=(PLinkStack)malloc(sizeof(LinkStack));  if(S){    S->top=NULL;  }  return S;}//壓棧void Push_Stack(PLinkStack S,BTree T){  PStack p;  p=(PStack)malloc(sizeof(Stack));  p->data=T;  p->next=S->top;  S->top=p;}//判空int empty_Stack(PLinkStack S){  if(S->top){    return 0;  }else{    return 1;  }}//出棧PStack Pop_Stack(PLinkStack S){  PStack q;   if(empty_Stack(S)){    return S->top;  }else{    q=S->top;    S->top=S->top->next;  }  return q;  }//銷毀棧void DestroyStack(PLinkStack S){  PStack del;   while(S->top!=NULL){    del=S->top;    S->top=S->top->next;    free(del);  }  free(S);} BTree BuildTree(void){  char ch;  BTree node;  ch=getchar();  if(ch=='#'){    node=NULL;  }else{    node=(BTree)malloc(sizeof(Tree));    node->element=ch;    node->left=BuildTree();    node->right=BuildTree();  }  return node;}void NotRecursionPostOrder(BTree T){  PLinkStack S,CS;  S=Init_Stack();  CS=Init_Stack();  while(T || !empty_Stack(S)){    if(T){      Push_Stack(S,T);      Push_Stack(CS,T);      T=T->right;    }else{      T=Pop_Stack(S)->data;      T=T->left;    }  }  while(CS->top!=NULL){    printf("%c",CS->top->data->element);    CS->top=CS->top->next;  }  DestroyStack(CS);}int main(void){  BTree T;  T=BuildTree();  NotRecursionPostOrder(T);  return 0;} 

法二:實現(xiàn)思路。按先序遍歷訪問每一個結(jié)點。存入棧中,當(dāng)為空時,就出立即棧(第一次出棧)。出棧后應(yīng)該立即進棧,去訪問進棧結(jié)點的右結(jié)點,這樣可以保證先輸出左、右結(jié)點,再輸出根結(jié)點。二次進棧利用flag標(biāo)記。

#include<stdio.h>#include<stdlib.h>typedef struct TreeNode {  char element;  int flag;  struct TreeNode *left, *right;}Tree, *BTree;typedef struct StackNode {  BTree data;  struct StackNode *next;}Stack, *PStack;typedef struct {  PStack top;}LinkStack, *PLinkStack;//初始化空棧PLinkStack Init_Stack(void) {  PLinkStack S = (PLinkStack)malloc(sizeof(LinkStack));  if (S) {    S->top = NULL;  }  return S;}//壓棧void Push_Stack(PLinkStack S, BTree T) {  PStack p;  p = (PStack)malloc(sizeof(Stack));  p->data = T;  p->next = S->top;  S->top = p;}//判空int empty_Stack(PLinkStack S) {  if (S->top) {    return 0;  }  else {    return 1;  }}//出棧PStack Pop_Stack(PLinkStack S) {  PStack q = S->top;  S->top = S->top->next;  return q;}BTree BuildTree(void) {  BTree t;  char ch;  ch = getchar();  if (ch == '#') {    t = NULL;  }  else {    t = (BTree)malloc(sizeof(Tree));    t->element = ch;    t->left = BuildTree();    t->right = BuildTree();  }  return t;}void DestroyStack(PLinkStack S){  PStack p;  while(S->top){    p=S->top;    free(p);    S->top=S->top->next;  }} void NotRecursionPostOrder(BTree T) {  PLinkStack S;  S = Init_Stack();  while (T || !empty_Stack(S)) {    if (T) {      T->flag = 0;      Push_Stack(S, T);      T = T->left;    }    else {      T = Pop_Stack(S)->data;      if (T->flag == 0) {        T->flag = 1;        Push_Stack(S, T);        T = T->right;      }      else {        if (T->flag == 1) {          printf("%c", T->element);          T = NULL;        }      }    }  }  DestroyStack(S);//銷毀棧 }int main(void) {  BTree T;  T = BuildTree();  NotRecursionPostOrder(T);  return 0;}


以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 家居| 多伦县| 鹤山市| 太仆寺旗| 伊宁县| 全南县| 马边| 垣曲县| 宁城县| 西乌珠穆沁旗| 广河县| 云南省| 留坝县| 隆子县| 扶余县| 固始县| 赞皇县| 卓尼县| 萨迦县| 津南区| 尉犁县| 湘潭县| 红桥区| 阳春市| 灵川县| 米易县| 德钦县| 岑巩县| 花莲市| 军事| 恩平市| 萨迦县| 商水县| 江永县| 乌恰县| 漯河市| 贵定县| 黔东| 胶南市| 孟连| 刚察县|