二叉树三种遍历算法的递归和非递归实现(C++)
2015-08-16 12:00
591 查看
struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; //递归前序遍历 void PreOrder(BinaryTreeNode* pNode) { if(pNode!=NULL) { cout<<pNode->m_nValue<<endl; PreOrder(pNode->m_pLeft); PreOrder(pNode->m_pRight); } } //非递归前序遍历 /* 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。 即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后, 若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树 */ void PreOrder_loop(BinaryTreeNode* pNode) { stack<BinaryTreeNode*> stackNode; while(!pNode||!stackNode.empty()) { while(!pNode) { cout<<pNode->m_nValue<<endl; stackNode.push(pNode); pNode=pNode->m_pLeft; } if(!stackNode.empty()) { pNode=stackNode.top(); stackNode.pop(); pNode=pNode->m_pRight; } } } //递归中序遍历 void InOrder(BinaryTreeNode* pNode) { if(pNode!=NULL) { InOrder(pNode->m_pLeft); cout<<pNode->m_nValue<<endl; InOrder(pNode->m_pRight); } } //非递归中序遍历 /* 根据中序遍历的顺序,对于任一结点,优先访问其左孩子,而左孩子结点又可以看做一根结点, 然后继续访问其左孩子结点,直到遇到左孩子结点为空的结点才进行访问,然后按相同的规则访问其右子树。 */ void InOrder_loop(BinaryTreeNode* pNode) { stack<BinaryTreeNode*> stackNode; while(!pNode||!stackNode.empty()) { while(!pNode) { stackNode.push(pNode); pNode=pNode->m_pLeft; } if(!stackNode.empty()) { pNode=stackNode.top(); cout<<pNode->m_nValue<<endl; stackNode.pop(); pNode=pNode->m_pRight; } } } //递归后序遍历 void PostOrder(BinaryTreeNode* pNode) { if(pNode!=NULL) { PostOrder(pNode->m_pLeft); PostOrder(pNode->m_pRight); cout<<pNode->m_nValue<<endl; } } //非递归后序遍历 /* 要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子, 则可以直接访问它;或者P 存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。 若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证 了每次取栈顶元素的时候,左孩子在右孩子前面被访问, 左孩子和右孩子都在根结点前面被访问。 */ void PostOrder_loop(BinaryTreeNode* pNode) { stack<BinaryTreeNode*> stackNode; BinaryTreeNode* cur;//当前节点 BinaryTreeNode* pre=NULL;//前一次访问的结点 stackNode.push(pNode); while(!stackNode.empty()) { cur=stackNode.top(); if((cur->m_pLeft==NULL&&cur->m_pRight==NULL) || (pre!=NULL&&(pre==cur->m_pLeft ||pre==cur->m_pRight))) { cout<<cur->m_nValue<<endl; stackNode.pop(); pre=cur; } else { if(cur->m_pRight!=NULL) stackNode.push(cur->m_pRight); if(cur->m_pLeft!=NULL) stackNode.push(cur->m_pLeft); } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 动易2006序列号破解算法公布
- 文件遍历排序函数
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua 学习笔记之C API 遍历 Table实现代码
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#中遍历Hashtable的4种方法
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C++联合体转换成C#结构的实现方法
- C#实现的算24点游戏算法实例分析