二叉樹非遞迴遍歷(三種+層序)
阿新 • • 發佈:2019-01-28
#include <iostream> #include <stdio.h> #include <queue> #include <stack> using namespace std; typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; BiTree CreateBiTree(){ char ch; BiTree T; cin>>ch; if(ch=='#') T=NULL; else{ T = (BiTree)malloc(sizeof(BiTNode)); T->data = ch; T->lchild = CreateBiTree(); T->rchild = CreateBiTree(); } return T; } void PreOrderTraverse(BiTree T){ stack<BiTree> s; while(!s.empty() || T){ while(T){ cout<<T->data<<" "; s.push(T) ; T = T->lchild; } if(s.top()){ T = s.top(); s.pop(); T = T->rchild; } } } void InOrderTraverse(BiTree T){ stack<BiTree> s; while(!s.empty() || T){ while(T){ s.push(T) ; T = T->lchild; } if(s.top()){ T = s.top(); s.pop(); cout<<T->data<<" "; T = T->rchild; } } } void PostOrderTraverse(BiTree T){ stack<BiTree> s; BiTree visited = NULL; BiTree pr = T; while(!s.empty() || pr){ while(pr){ s.push(pr) ; pr = pr->lchild; } T = s.top(); if(T->rchild == NULL || T->rchild == visited ){ cout<<T->data<<" "; s.pop(); visited = T; } else{ pr = T->rchild; } } } void LeverOrderTraverse(BiTree T){ queue<BiTree> q; BiTree p; if(T == NULL) return ; q.push(T); while(!q.empty()){ p = q.front(); cout<<p->data<<" "; q.pop(); if(p->lchild != NULL ) q.push(p->lchild); if(p->rchild != NULL ) q.push(p->rchild); } } int main() { BiTree T= CreateBiTree(); PreOrderTraverse(T); cout<<endl; InOrderTraverse(T); cout<<endl; PostOrderTraverse(T); cout<<endl; LeverOrderTraverse(T); cout<<endl; }