void PreOrder(Node *root) { if(root == NULL) return ; Node *p = root; stack<Node *> s; s.push(p); while(!s.empty()) { Node *node = s.pop(); visit(node); if(node->right != NULL) { s.push(node->right); } if(node->left != NULL) { s.push(node->left); } } } void InOrder(Node *root) { Node *p = root; stack<Node *> s; while(p != NULL || !s.empty()) { if(p != NULL) { s.push(p); p = p->left; } else { Node * p = s.pop(); visit(p); p = p->right; } } } void PostOrder(Node *root) { Node *p = root; stack<Node *> s; Node *lastVisit = NULL; while(p != NULL || !s.empty()) { while(p != NULL) { s.push(p); p = p->left; } Node *tmp = s.top(); if(tmp->right == NULL || tmp->right == lastVisit) { s.pop(); visit(tmp); lastVisit = tmp; } else { p = tmp->right; } } }