#include<iostream>
#include<stdlib.h>
#define maxsize 100
using namespace std;
typedef struct BTNode{
char val;
BTNode *lchild, *rchild;
}*BiTNode;
void CreateTree(BTNode *&root){
char c;
cin >> c;
if(c == '#')
root = NULL;
else{
root = (BTNode *) malloc(sizeof(BTNode));
if(!root){
cerr << "No More Memory!" << endl;
exit(-1);
}
root->val = c;
CreateTree(root->lchild);
CreateTree(root->rchild);
}
}
void PreOrderRecursion(BTNode *root){
if(root){
cout << root->val << " ";
PreOrderRecursion(root->lchild);
PreOrderRecursion(root->rchild);
}
}
void PreOrderNoRecursion(BTNode *root){
if(!root){
cout << "Root is NULL!" << endl;
return;
}
BTNode* stack[maxsize]; //模擬一個棧
int top = -1; //棧頂指針
stack[++top] = root;
while(top != -1){
BTNode *p = stack[top--];
cout << p->val << " ";
if(p->rchild) //由於左子樹先被訪問,則右子樹應該先入棧
stack[++top] = p->rchild;
if(p->lchild)
stack[++top] = p->lchild;
}
}
void InOrderRecursion(BTNode *root){
if(root){
InOrderRecursion(root->lchild);
cout << root->val << " ";
InOrderRecursion(root->rchild);
}
}
void InOrderNoRecursion(BTNode *root){
if(!root){
cout << "Root is NULL!" << endl;
return;
}
BTNode* stack[maxsize];
int top = -1;
BTNode *p = root;
while(top != -1 || p != NULL){
while(p){
stack[++top] = p;
p = p->lchild;
}
//從根節點一直往左子樹遍歷,如果沒有左子樹
//打印這個節點,往右節點移動
p = stack[top--];
cout << p->val << " ";
p = p->rchild;
}
}
void PostOrderRecursion(BTNode *root){
if(root){
PostOrderRecursion(root->lchild);
PostOrderRecursion(root->rchild);
cout << root->val << " ";
}
}
void PostOrderNoRecursion(BTNode *root){
if(!root){
cout << "Root is NULL!" << endl;
return;
}
BTNode* stack1[maxsize]; int top1 = -1;
BTNode* stack2[maxsize]; int top2 = -1;
//首先把根節點如stack1
stack1[++top1] = root;
while(top1 != -1){
BTNode *p = stack1[top1--];
stack2[++top2] = p;
if(p->lchild)
stack1[++top1] = p->lchild;
if(p->rchild)
stack1[++top1] = p->rchild;
}
//此時倒序輸出stack2即為后序遍歷的序列
while(top2 != -1){
BTNode *p = stack2[top2--];
cout << p->val << " ";
}
}
int main(){
BTNode *root;
CreateTree(root);
/**
test code
*/
return 0;
}