二叉树的非递归遍历

来源:互联网 发布:淘宝推广网站有哪些 编辑:程序博客网 时间:2024/05/17 05:50

理解好这个问题,对于递归的理解和递归转非递归的方法都有很好的益处。

#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

原创粉丝点击