#include <iostream>
using namespace std;
//================================栈定义=========================
template <typename T> class Stack{
private:
class Element{
public:
T value;
Element(T v){
value = v;
next = NULL;
}
Element* next;
};
Element* top;
public:
Stack(){
top = NULL;
}
T getTop(){
return top->value;
}
void push(T v){
Element* e = new Element(v);
if(!top) {
top = e;
} else {
e->next = top;
top = e;
}
}
T pop(){
if(!top)
return NULL;
T v = getTop();
Element* temp = top;
top = top -> next;
delete temp;
return v;
}
bool isEmpty(){
return top == NULL;
}
};
//==========================二叉树=============================
int count = 0;
class BinTree{
public:
BinTree(int v){
value = v;
left = NULL;
right = NULL;
}
int value;
BinTree* left;
BinTree* right;
};
void createTree(BinTree* &tree,int depth,int cur) {
if(cur < depth) {
tree = new BinTree(count);
count++;
createTree(tree->left,depth,cur+1);
createTree(tree->right,depth,cur+1);
} else {
return;
}
}
void print(BinTree* tree) {
cout<<tree->value<<endl;
}
void inOrder(BinTree* tree,void visit(BinTree*)){
Stack<BinTree*> stack;
stack.push(tree);
while(!stack.isEmpty()){
while(stack.getTop() && tree ) {
tree = stack.getTop();
stack.push(tree->left);
}
stack.pop();
tree = stack.pop();
if(tree){
visit(tree);
stack.push(tree->right);
}
}
}
void preOrder(BinTree* tree,void visit(BinTree*)){
Stack<BinTree*> stack;
stack.push(tree);
while(!stack.isEmpty()) {
while(tree && stack.getTop()){
tree = stack.getTop();
visit(tree);
stack.push(tree->left);
}
stack.pop();
tree = stack.pop();
if(tree)
stack.push(tree->right);
}
}
int main(){
BinTree* tree;
createTree(tree,4,0);
cout<<"InOrder:"<<endl;
inOrder(tree,&print);
cout<<"PreOrder:"<<endl;
preOrder(tree,&print);
cout<<endl;
return 0;
}
using namespace std;
//================================栈定义=========================
template <typename T> class Stack{
private:
class Element{
public:
T value;
Element(T v){
value = v;
next = NULL;
}
Element* next;
};
Element* top;
public:
Stack(){
top = NULL;
}
T getTop(){
return top->value;
}
void push(T v){
Element* e = new Element(v);
if(!top) {
top = e;
} else {
e->next = top;
top = e;
}
}
T pop(){
if(!top)
return NULL;
T v = getTop();
Element* temp = top;
top = top -> next;
delete temp;
return v;
}
bool isEmpty(){
return top == NULL;
}
};
//==========================二叉树=============================
int count = 0;
class BinTree{
public:
BinTree(int v){
value = v;
left = NULL;
right = NULL;
}
int value;
BinTree* left;
BinTree* right;
};
void createTree(BinTree* &tree,int depth,int cur) {
if(cur < depth) {
tree = new BinTree(count);
count++;
createTree(tree->left,depth,cur+1);
createTree(tree->right,depth,cur+1);
} else {
return;
}
}
void print(BinTree* tree) {
cout<<tree->value<<endl;
}
void inOrder(BinTree* tree,void visit(BinTree*)){
Stack<BinTree*> stack;
stack.push(tree);
while(!stack.isEmpty()){
while(stack.getTop() && tree ) {
tree = stack.getTop();
stack.push(tree->left);
}
stack.pop();
tree = stack.pop();
if(tree){
visit(tree);
stack.push(tree->right);
}
}
}
void preOrder(BinTree* tree,void visit(BinTree*)){
Stack<BinTree*> stack;
stack.push(tree);
while(!stack.isEmpty()) {
while(tree && stack.getTop()){
tree = stack.getTop();
visit(tree);
stack.push(tree->left);
}
stack.pop();
tree = stack.pop();
if(tree)
stack.push(tree->right);
}
}
int main(){
BinTree* tree;
createTree(tree,4,0);
cout<<"InOrder:"<<endl;
inOrder(tree,&print);
cout<<"PreOrder:"<<endl;
preOrder(tree,&print);
cout<<endl;
return 0;
}