C++实现二叉树的递归遍历与非递归遍历(先序、中序、后序、层序)
来源:互联网 发布:自行车风火轮编辑软件 编辑:程序博客网 时间:2024/04/29 16:56
递归实现很简单,非递归实现需要借用栈模拟递归实现,搞清楚过程后代码实现不难,直接上代码。
#include <iostream>#include <stack>#include <queue>using namespace std;template<typename T>struct BiNode { T value; BiNode *pLeft; BiNode *pRight; BiNode() : pLeft(NULL), pRight(NULL) { }};template<typename T>struct BiNodeAux { BiNode<T> *pNode; bool hasVisited; BiNodeAux(BiNode<T> *_node, bool _vis) : pNode(_node), hasVisited(_vis) { }};template<typename T>void PreOrderRecursively(BiNode<T> *pRoot){ if (pRoot == NULL) return; cout << pRoot->value << "\t"; PreOrder(pRoot->pLeft); PreOrder(pRoot->pRight);}template<typename T>void PreOrder(BiNode<T> *pRoot){ if (pRoot == NULL) return; stack<BiNodeAux<T> > s; BiNode<T> *pCur = pRoot; while (pCur != NULL || !s.empty()) { if (pCur != NULL) { cout << pCur->value << "\t"; s.push(BiNodeAux<T>(pCur, false)); pCur = pCur->pLeft; } else { if (s.top().hasVisited == true)s.pop(); else {s.top().hasVisited = true;pCur = s.top().pNode->pRight; } } }}template<typename T>void InOrderRecursively(BiNode<T> *pRoot){ if (pRoot != NULL) { InOrderRecursively(pRoot->pLeft); cout << pRoot->value << "\t"; InOrderRecursively(pRoot->pRight); }}template<typename T>void InOrder(BiNode<T> *pRoot){ if (pRoot == NULL) return; stack<BiNode<T>*> s; BiNode<T> *pCur = pRoot; while (pCur != NULL || !s.empty()) { if (pCur != NULL) { s.push(pCur); pCur = pCur->pLeft; } else { cout << s.top()->value << "\t"; pCur = s.top()->pRight; s.pop(); } }}template<typename T>void PostOrderRecursively(BiNode<T> *pRoot){ if (pRoot != NULL) { PostOrderRecursively(pRoot->pLeft); PostOrderRecursively(pRoot->pRight); cout << pRoot->value << "\t"; }}template<typename T>void PostOrder(BiNode<T> *pRoot){ if (pRoot == NULL) return; stack<BiNodeAux<T> > s; BiNode<T> *pCur = pRoot; while (pCur != NULL || !s.empty()) { if (pCur != NULL) { s.push(BiNodeAux<T>(pCur, false)); pCur = pCur->pLeft; } else { if (s.top().hasVisited == false) {s.top().hasVisited = true;pCur = s.top().pNode->pRight; } else {cout << s.top().pNode->value << "\t";s.pop(); } } }}template<typename T>void LevelOrder(BiNode<T> *pRoot){ if (pRoot == NULL) return; queue<BiNode<T>*> q; BiNode<T> *pCur = pRoot; q.push(pCur); while (!q.empty()) { pCur = q.front(); cout << pCur->value << "\t"; q.pop(); if (pCur->pLeft != NULL) q.push(pCur->pLeft); if (pCur->pRight != NULL) q.push(pCur->pRight); }}int main(){ BiNode<int> nodes[7]; for (int i = 0; i < 7; ++i) nodes[i].value = i + 1; nodes[0].pLeft = &nodes[1]; nodes[0].pRight = &nodes[2]; nodes[1].pLeft = &nodes[3]; nodes[1].pRight = &nodes[4]; nodes[2].pLeft = &nodes[5]; nodes[2].pRight = &nodes[6]; PreOrderRecursively(&nodes[0]); cout << endl; PreOrder(&nodes[0]); cout << endl << endl; InOrderRecursively(&nodes[0]); cout << endl; InOrder(&nodes[0]); cout << endl << endl; PostOrderRecursively(&nodes[0]); cout << endl; PostOrder(&nodes[0]); cout << endl << endl; LevelOrder(&nodes[0]); cout << endl << endl; return 0;}
0 0
- C++实现二叉树的递归遍历与非递归遍历(先序、中序、后序、层序)
- 二叉树的先序、中序、后序、层序递归及非递归遍历
- 二叉树的先序/中序/后序(递归、非递归)+层序遍历
- C语言非递归实现二叉树的先序、中序、后序、层序遍历
- c语言原生实现二叉树的 非递归 中序 先序 后序 遍历
- 二叉树非递归实现先序,中序,后序,按层遍历
- 二叉树(一) 先序遍历、中序遍历、后续遍历、层次遍历的递归与非递归实现
- 二叉树的先序、中序、后序遍历的递归和非递归实现
- 二叉树的先序、中序、后序递归遍历和非递归遍历
- 二叉树的先序、中序和后序遍历,递归与非递归方式实现。
- 二叉树的先序,中序,层次遍历,递归与非递归实现
- 二叉树 非递归 先序遍历 中序遍历 后序遍历 层次遍历
- 二叉树遍历 递归与非递归 先序-中序-后序
- 二叉树的先序、中序、后序遍历的非递归实现
- 二叉树遍历的非递归算法(先序、中序、后序)代码实现
- [二叉树专题]:先序遍历二叉树的递归实现与非递归实现
- 非递归遍历二叉树(先序、中序、后序、层序)
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- NGUI-2D屏幕自适应
- VisionMobile:三星如何争取开发者了解健康数据
- 游戏开发中的数学、向量的应用
- Chrome 快捷键 整理版
- 黑马程序员_java基础--面向对象(3)
- C++实现二叉树的递归遍历与非递归遍历(先序、中序、后序、层序)
- cxf + spring 的WS-Security示例
- 深入了解Struts2返回JSON数据的原理及具体应用范例
- PLSQL导入导出oracle表
- 手机越狱了,丢失了好多号码,怎么才能找回来.
- Cocos2d-x 3.0正式版及android环境搭建详细教程
- HDU 1016 Prime Ring Problem(DFS回溯+素数判断)
- zedboard中使用opencv对视频进行处理
- cisco 路由器删除单条ACL