理解好这个问题,对于递归的理解和递归转非递归的方法都有很好的益处。
#include <stdio.h> #include <stack> template<typename T> class TreeNode { public: TreeNode() : left_(NULL), right_(NULL) {} T value_; TreeNode* left_; TreeNode* right_; }; template<typename T, typename VisitFun> void PreOrderVisit(TreeNode<T>* root, VisitFun visit_fun) { std::stack<TreeNode<T>*> visit_stack; TreeNode<T>* current = root; while (current || !visit_stack.empty()) { if (current) { visit_fun(current); visit_stack.push(current); current = current->left_; continue; } current = visit_stack.top(); visit_stack.pop(); current = current->right_; } } template<typename T, typename VisitFun> void InOrderVisit(TreeNode<T>* root, VisitFun visit_fun) { std::stack<TreeNode<T>*> visit_stack; TreeNode<T>* current = root; while (current ||!visit_stack.empty()) { if (current) { visit_stack.push(current); current = current->left_; continue; } current = visit_stack.top(); visit_fun(current); visit_stack.pop(); current = current->right_; } } template<typename T, typename VisitFun> void PostOrderVisit(TreeNode<T>* root, VisitFun visit_fun) { std::stack<TreeNode<T>*> visit_stack; TreeNode<T>* current = root; TreeNode<T>* previous = NULL; while (current || !visit_stack.empty()) { if (current) { visit_stack.push(current); current = current->left_; continue; } current = visit_stack.top(); if (current->right_ && current->right_ != previous) { current = current->right_; previous = NULL; } else { visit_fun(current); previous = current; visit_stack.pop(); current = NULL; } } } void MyVisitFun(TreeNode<int>* current) { printf("%d ", current->value_); } int main(int argc, char** argv) { const int kNodeAmount = 15; TreeNode<int> tree[kNodeAmount]; for (int i = 0; i < kNodeAmount; ++i) { tree[i].value_ = i; } int i = 0; int left = 0; int right = 0; while (true) { left = 2 * (i + 1) - 1; right = 2 * (i + 1); if (left >= kNodeAmount || right >= kNodeAmount) { break; } tree[i].left_ = tree + left; tree[i].right_ = tree + right; i++; } PreOrderVisit(tree, MyVisitFun); printf("\n"); InOrderVisit(tree, MyVisitFun); printf("\n"); PostOrderVisit(tree, MyVisitFun); printf("\n"); }
http://www.cppblog.com/ngaut/archive/2011/11/27/2351.html
http://bbs.pfan.cn/post-164802.html
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=331522