二叉樹先序,中序,後序遍歷非遞迴實現
阿新 • • 發佈:2019-02-14
利用棧實現二叉樹的先序,中序,後序遍歷的非遞迴操作
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <queue> #include <stack> #include <iostream> using namespace std; typedef struct BiTNode{ char data; BiTNode *lchild, *rchild; }BiTNode,*BiTree; void CreateBiTree(BiTree &T)//建樹,按先序順序輸入節點 { char ch; scanf("%c",&ch); if(ch==' ') { T=NULL; return; } else { T=(BiTree)malloc(sizeof(BiTNode)); if(!T) exit(1); T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } } void InOrderTraverse(BiTree T)//非遞迴中序遍歷 { stack<BiTree> Stack; if(!T) { printf("空樹!\n"); return; } while(T || !Stack.empty()) { while(T) { Stack.push(T); T=T->lchild; } T=Stack.top(); Stack.pop(); printf("%c",T->data); T=T->rchild; } } void PreOrderTraverse(BiTree T)//非遞迴先序遍歷 { stack<BiTree> Stack; if(!T) { printf("空樹!\n"); return; } while(T || !Stack.empty()) { while(T) { Stack.push(T); printf("%c",T->data); T=T->lchild; } T=Stack.top(); Stack.pop(); T=T->rchild; } } void PostOrderTraverse(BiTree T)//非遞迴後序遍歷,用一個標記標記右子樹是否訪問過 { int flag[20]; stack<BiTree> Stack; if(!T) { printf("空樹!\n"); return; } while(T) { Stack.push(T); flag[Stack.size()]=0; T=T->lchild; } while(!Stack.empty()) { T=Stack.top(); while(T->rchild && flag[Stack.size()]==0) { flag[Stack.size()]=1; T=T->rchild; while(T) { Stack.push(T); flag[Stack.size()]=0; T=T->lchild; } } T=Stack.top(); printf("%c",T->data); Stack.pop(); } } void main() { BiTree T; CreateBiTree(T); PreOrderTraverse(T); printf("\n"); InOrderTraverse(T); printf("\n"); PostOrderTraverse(T); printf("\n"); }