C語言非遞歸后序遍歷二叉樹
本文實(shí)例為大家分享了C語言非遞歸后序遍歷二叉樹的具體代碼,供大家參考,具體內(nèi)容如下
法一:實(shí)現(xiàn)思路:一個(gè)棧 先按 根->右子樹->左子樹的順序訪問二叉樹。訪問時(shí)不輸出。另一個(gè)棧存入前一個(gè)棧只進(jìn)棧的結(jié)點(diǎn)。
最后輸出后一個(gè)棧的結(jié)點(diǎn)數(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; }
法二:實(shí)現(xiàn)思路。按先序遍歷訪問每一個(gè)結(jié)點(diǎn)。存入棧中,當(dāng)為空時(shí),就出立即棧(第一次出棧)。出棧后應(yīng)該立即進(jìn)棧,去訪問進(jìn)棧結(jié)點(diǎn)的右結(jié)點(diǎn),這樣可以保證先輸出左、右結(jié)點(diǎn),再輸出根結(jié)點(diǎn)。二次進(jìn)棧利用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í)有所幫助,也希望大家多多支持我們。
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文