二叉树的非递归遍历
来源:互联网 发布:淘宝推广网站有哪些 编辑:程序博客网 时间: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
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的创建,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的非递归遍历以及递归遍历
- 二叉树的非递归遍历&递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的构造,递归遍历,非递归遍历
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树的递归遍历与非递归遍历
- man 命令的使用
- 虚基类 和 虚函数
- 利用GPO开启管理共享admin$
- 定制自己的eversecOS
- Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
- 二叉树的非递归遍历
- 插入多行数据——存储过程加函数
- 2012中小企业为什么需要搜索引擎营销?
- Android 如何才能捕获系统的恢复出厂设置事件
- struts2.0中struts.xml配置文件详解
- 使用Arduino与DHT11监测温湿度
- djang Extra fields on many-to-many relationships
- msql的一些基本知识
- OverlayIcon 制作流程及注意项