用的是C++ STL的栈和队。。其中后序遍历的非递归比较难写。注释也是最多。
#include<iostream>
#include<stdlib.h>
#include<string>
#include<stack>
#include<queue>
using namespace std;
typedef char Element;
typedef struct Node{
Element data;
Node* ltree;
Node* rtree;
}BNode;
typedef BNode* BTree;
//有自己的创建规则
bool creatBinaryTree(BTree &T,char a[],int &k){
Element e=a[k];
if(e==';'){
T=NULL;
}
else{
T=(BTree)malloc(sizeof(Node));
T->data=e;
k++;
creatBinaryTree(T->ltree,a,k);
k++;
creatBinaryTree(T->rtree,a,k);
}
return true;
}
void preOrderTraverseStack(BTree T){
stack<BTree> s;
BTree p=T;
// s.push(p); 刚开始需不需要压栈
while(p||!s.empty()){ //进入循环的条件
if(p) {
cout<<p->data;
s.push(p);
p=p->ltree;
}
else{
p=s.top();
s.pop();
p=p->rtree;
}
}
}
void inOrderTraverseStack(BTree T){
stack<BTree> s;
BTree p=T;
while(p||!s.empty()){ //进入循环的条件
if(p) {
s.push(p);
p=p->ltree;
}
else{
p=s.top();
s.pop();
cout<<p->data;
p=p->rtree;
}
}
}
//后序遍历的重点是,结点可以访问的条件是 1、左子树访问完毕,2、右子树访问完毕(结点为NULL或者已经访问过了)
void postOrderTraverseStack(BTree T){
stack<BTree> s;
BTree p=T;
BTree n=NULL;
while(p||!s.empty()){
while(p){
s.push(p);
p=p->ltree; //1、左子树访问完毕,
} // 此时先不用出栈 ,
p=s.top(); // 只需获取栈顶的结点即可 。
if(p->rtree==NULL||p->rtree==n){ //2、右子树访问完毕(右结点为NULL或者右结点为上次访问的结点)
cout<<p->data; // 访问完才出栈
n=p;
p=NULL;
s.pop();
}else{
p=p->rtree;
}
}
}
void preOrderTraverse(BTree T){
if(T){
cout<<T->data;
preOrderTraverse(T->ltree);
preOrderTraverse(T->rtree);
}
}
void inOrderTraverse(BTree T){
if(T){
inOrderTraverse(T->ltree);
cout<<T->data;
inOrderTraverse(T->rtree);
}
}
void postOrderTraverse(BTree T){
if(T){
postOrderTraverse(T->ltree);
postOrderTraverse(T->rtree);
cout<<T->data;
}
}
void levelTraverse(BTree T){
queue<BTree> q;
q.push(T);
while(!q.empty()){
BTree p=q.front();
q.pop();
cout<<p->data;
if(p->ltree){
q.push(p->ltree);
}
if(p->rtree){
q.push(p->rtree);
}
}
}
int main(){
BTree L=NULL;
char a[15]={'a','b','d',';',';','e','g',';',';',';','c',';','f',';',';'};
int k=0;
creatBinaryTree(L,a,k);
preOrderTraverse(L);cout<<endl;
inOrderTraverse(L);cout<<endl;
postOrderTraverse(L);cout<<endl;
preOrderTraverseStack(L);cout<<endl;
inOrderTraverseStack(L);cout<<endl;
postOrderTraverseStack(L);cout<<endl;
levelTraverse(L);
}