Binary Tree pre-order, middle-order, post-order, and hierarchical Traversal Algorithms
Non-recursive version:
Vector <int> postordertraversal (treenode * root) {vector <int> vect; If (! Root) {return vect;} stack <treenode *> stackdata; stackdata. Push (Root); treenode * cur = NULL; treenode * pre = NULL; while (! Stackdata. Empty () {cur = stackdata. Top (); If (cur-> left = NULL & cur-> right = NULL | (pre! = NULL) & (pre = cur-> left | pre = cur-> right) {vect. push_back (cur-> Val); Pre = cur; stackdata. pop ();} else {If (cur-> right) {stackdata. push (cur-> right);} If (cur-> left) {stackdata. push (cur-> left) ;}}return vect;} vector <int> preorderttraversal (treenode * root) {vector <int> vect; If (! Root) {return vect;} stack <treenode *> stackdata; treenode * pnode = root; while (pnode |! Stackdata. Empty () {While (pnode) {vect. push_back (pnode-> Val); stackdata. Push (pnode); pnode = pnode-> left;} If (! Stackdata. empty () {pnode = stackdata. top (); stackdata. pop (); pnode = pnode-> right;} return vect;} vector <int> inordertraversal (treenode * root) {vector <int> inorder; stack <treenode *> stackdata; treenode * pnode = root; while (pnode |! Stackdata. Empty () {While (pnode) {stackdata. Push (pnode); pnode = pnode-> left;} If (! Stackdata. empty () {pnode = stackdata. top (); inorder. push_back (pnode-> Val); stackdata. pop (); pnode = pnode-> right ;}} return inorder ;}vector <vector <int> levelorderbottom (treenode * root) {vector <int> result; if (! Root) {return result;} vector <int> curlevel; queue <treenode *> q; q. Push (Root); q. Push (null); While (! Q. empty () {treenode * node = Q. front (); q. pop (); If (node) {curlevel. push_back (node-> Val); If (node-> left) {q. push (node-> left);} If (node-> right) {q. push (node-> right) ;}} else {result. push_back (curlevel); curlevel. clear (); If (! Q. empty () // This field is critical. Otherwise, an endless Q will occur. push (null) ;}} reverse (result. begin (), result. end (); return result ;}
Binary tree traversal algorithm