template <typename T> struct BinaryNode{
T elem;
BinaryNode *left;
BinaryNode * right;
BinaryNode(T d, BinaryNode *l=NULL, BinaryNode *r=NULL):elem(d),left(l),right(r){};
};
template <typename T>
void inorder_recursive(BinaryNode<T>* root, void (*visit)(T &x))
{
if(root != NULL)
{
inorder_recursive(root->left,visit);
visit(root->elem) ;
inorder_recursive(root->right,visit);
}
}
template <typename T>
T elem;
BinaryNode *left;
BinaryNode * right;
BinaryNode(T d, BinaryNode *l=NULL, BinaryNode *r=NULL):elem(d),left(l),right(r){};
};
template <typename T>
void inorder_recursive(BinaryNode<T>* root, void (*visit)(T &x))
{
if(root != NULL)
{
inorder_recursive(root->left,visit);
visit(root->elem) ;
inorder_recursive(root->right,visit);
}
}
template <typename T>
void nonRecursiveInorder(BinaryNode *root, void(*visit)(T &x))
stack<BinaryNode*> s;
p=root;//p points the current root of traversal
while(p || !s.empty())
if(p){// push root into stack and traversethe left subtree
s.push(p);
· p=p->left;
}
else{
//noleft subtree, pop out the root, visit the root
//and traverse the right subtree
p = s.top();
visit(p->data)) ;
p=p->right;
}
}
}