二叉树中序遍历 -- 递归和非递归实现
2016-04-12 22:32
232 查看
/* 实现二叉树中序遍历 -- 采用递归和非递归方法 ** 经调试可直接运行源码如下 **/ #include <stdio.h> #include <stdlib.h> #include <iostream> #include <stack> using namespace std; /*二叉树结点定义*/ typedef struct BTreeNode { char elem; struct BTreeNode *pleft; struct BTreeNode *pright; }BTreeNode; /* 如果根节点为NULL,返回 根节点不为NULL,先访问左子树,再访问根节点,最后访问右子树 */ /*中序遍历 递归实现*/ void mid_order_traverse(BTreeNode *proot) { if (proot == NULL) { return; } mid_order_traverse(proot->pleft);//左子树 cout << "递归遍历节点" << proot->elem << endl;//访问根节点 mid_order_traverse(proot->pright);//右子树 return; } /*中序遍历 非递归实现*/ /* 第一步:给定根节点proot,判断proot是否为空,如果不为空,然后进行第二步; 如果为空,则进行第三步; 第二步:将proot入栈,将proot的左结点赋给proot,然后进行第一步; 第三步:判断栈是否为空;如果为空,则结束,如果不为空, 则取出栈顶元素给proot,并出栈,访问proot,然后将proot的 右结点赋给proot,然后进行第一步。 */ /*中序遍历非递归实现*/ void mid_trvaverse(BTreeNode *proot) { if (proot == NULL) { return; } stack <BTreeNode*> st; while (proot != NULL || !st.empty()) { while (proot != NULL) { st.push(proot); proot = proot->pleft; } if (!st.empty()) { proot = st.top(); st.pop(); cout << "非递归遍历节点" << proot->elem << endl; proot = proot->pright; } } return; } /*初始化二叉树根节点*/ BTreeNode* btree_init(BTreeNode *&bt) { bt = NULL; return bt; } /*先序创建二叉树*/ void pre_crt_tree(BTreeNode* &bt) { char ch; cin >> ch; if (ch == '#') { bt = NULL; } else { bt = new BTreeNode; bt->elem = ch; pre_crt_tree(bt->pleft); pre_crt_tree(bt->pright); } } int main() { BTreeNode *bt; btree_init(bt);//初始化根节点 pre_crt_tree(bt);//创建二叉树 mid_trvaverse(bt);//非递归遍历 mid_order_traverse(bt);//递归遍历 system("pause"); return 0; } /* 运行结果: a b # # c # # ---以上为输入--- ---以下为输出--- 非递归遍历节点b 非递归遍历节点a 非递归遍历节点c 递归遍历节点b 递归遍历节点a 递归遍历节点c 请按任意键继续. . . 本例创建的二叉树形状: a b c 参考资料: http://blog.csdn.net/beitiandijun/article/details/41926903 http://yuncode.net/code/c_505ea04f8f6186 */
相关文章推荐
- Java_SE12-XML
- Java中list、set、map的输出格式
- MySQL Create Table创建表
- POJ 3641 Pseudoprime numbers
- Android Service
- ++i 与i++的区别
- 在Entity Framework 中实现继承关系映射到数据库表
- ffmpeg 获取视频关键帧
- C++第三次实验-个人所得税计算器
- 文件监控
- 关于QStringRef
- 03—Code First
- Notification、KVO实现代码
- uva 12545 Bits Equalizer (SWERC 2012) 贪心 分析
- 学习总结:局部搜索
- 两个栈实现一个队列
- OC学习日记Day1:程序怎么执行、类和对象
- 拖欠很久的堆
- Lua数据类型转换
- 最新版ffmpeg 提取视频关键帧