C++实现二叉树的递归遍历与非递归遍历
2017-12-02 15:25
597 查看
基本上所有关于二叉树的操作都是基于二叉树的遍历算法来实现的,因此在这里讲一下二叉树的遍历算法,其中包括递归与非递归算法,在算法中用输出节点数据来代替对节点的操作。
首先给出这样一棵数:
![](https://img-blog.csdn.net/20171202133510966?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHV6aGFuZ3pl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
1、前序遍历
所谓前序遍历就是先对节点数据进行处理,然后才对这个节点的左右子树进行处理。对这棵二叉树的前序遍历结果为:ABDCEFG。
递归:
非递归:
非递归方式需要用到栈,这里给出两种算法:
第一种:
第二种:
调用三种方法:
![](https://img-blog.csdn.net/20171202135134465?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHV6aGFuZ3pl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
中序遍历:
中序遍历顺序为左子树->节点->右子树,这棵二叉树的遍历结果为:BDAECFG
递归:
非递归:
调用两种中序遍历算法:
![](https://img-blog.csdn.net/20171202150222510?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHV6aGFuZ3pl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
后序遍历
后序遍历顺序为:左子树->右子树->节点,这棵二叉树的遍历结果为DBEGFCA
递归:
非递归:
调用两种方法:
![](https://img-blog.csdn.net/20171202151045398?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHV6aGFuZ3pl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
层序遍历
层序遍历算法不同于前序、中序、后序算法,层序遍历用递归方式实现比较困难,一般用队列结合循环实现比较简单。其基本思想是从根节点开始一层一层的从上向下遍历,其过程为:
![](https://img-blog.csdn.net/20171202151927809?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHV6aGFuZ3pl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
因此层序遍历的结果为:ABCDEFG
其代码实现为:
遍历结果:
![](https://img-blog.csdn.net/20171202152156086?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHV6aGFuZ3pl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
算法实现还有待改进,望高手斧正!
首先给出这样一棵数:
1、前序遍历
所谓前序遍历就是先对节点数据进行处理,然后才对这个节点的左右子树进行处理。对这棵二叉树的前序遍历结果为:ABDCEFG。
递归:
void _PreOrder(PNode& pRoot) { if (pRoot) { cout << pRoot->_data << " "; _PreOrder(pRoot->_LChild); _PreOrder(pRoot->_RChild); } } void PreOrder() { _PreOrder(_pRoot); cout << endl; }
非递归:
非递归方式需要用到栈,这里给出两种算法:
第一种:
void PreOrder_Nor1() { if(NULL == _pRoot) return; stack<pNode> s; s.push(_pRoot); pNode pTemp = NULL; while(!s.empty()) { pTemp = s.top(); cout<< pTemp->_data << " "; s.pop(); if(NULL != pTemp->_RChild) s.push(pTemp->_RChild); if(NULL != pTemp->_LChild) s.push(pTemp->_LChild); } co 4000 ut<<endl; }
第二种:
void PreOrder_Nor2() { if(NULL == _pRoot) return; stack<pNode> s; s.push(_pRoot); pNode cur = NULL; while(!s.empty()) { cur = s.top(); s.pop(); while(cur) { cout<< cur->_data << " "; if(cur->_RChild) s.push(cur->_RChild); cur = cur->_LChild; } } cout<<endl; }
调用三种方法:
中序遍历:
中序遍历顺序为左子树->节点->右子树,这棵二叉树的遍历结果为:BDAECFG
递归:
void _InOrder(PNode& pRoot) { if (pRoot) { _InOrder(pRoot->_LChild); cout << pRoot->_data << " "; _InOrder(pRoot->_RChild); } } void InOrder() { _InOrder(_pRoot); cout << endl; }
非递归:
void InOrder_Nor() { if(NULL == _pRoot) return; stack<pNode> s; pNode cur = _pRoot; pNode pPre = NULL; while(!s.empty() || cur) { while(cur && cur != pPre) { s.push(cur); cur = cur->_LChild; } if(s.empty()) return; cur = s.top(); cout<< cur->_data << " "; pPre = cur; s.pop(); cur = cur->_RChild; } cout<<endl; }
调用两种中序遍历算法:
后序遍历
后序遍历顺序为:左子树->右子树->节点,这棵二叉树的遍历结果为DBEGFCA
递归:
void _PostOrder(PNode& pRoot) { if (pRoot) { _PostOrder(pRoot->_LChild); _PostOrder(pRoot->_RChild); cout << pRoot->_data << " "; } } void PostOrder() { _PostOrder(_pRoot); cout << endl; }
非递归:
void PostOrder_Nor() { if(NULL == _pRoot) return; stack<pNode> s; s.push(_pRoot); pNode cur = _pRoot->_LChild; pNode pPre = NULL; while(!s.empty()) { while(cur && cur!= pPre) { s.push(cur); cur = cur->_LChild; } if(s.empty()) return; cur = s.top(); if(cur->_RChild && cur->_RChild != pPre) { cur = cur->_RChild; } else { cout<< cur->_data << " "; pPre = cur; s.pop(); } } cout<<endl; }
调用两种方法:
层序遍历
层序遍历算法不同于前序、中序、后序算法,层序遍历用递归方式实现比较困难,一般用队列结合循环实现比较简单。其基本思想是从根节点开始一层一层的从上向下遍历,其过程为:
因此层序遍历的结果为:ABCDEFG
其代码实现为:
void LevelOrder() { queue<PNode> q; if (_pRoot) q.push(_pRoot); while (!q.empty()) { PNode tmp = q.front(); cout << tmp->_data << " "; if (tmp->_LChild) q.push(tmp->_LChild); if (tmp->_RChild) q.push(tmp->_RChild); q.pop(); } cout << endl; }
遍历结果:
算法实现还有待改进,望高手斧正!
相关文章推荐
- C++实现二叉树的递归与非递归遍历
- 二叉树建立与遍历递归操作c++实现
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 二叉树的创建、前序中序后序递归遍历与非递归遍历、层序遍历以及二叉树简单应用的C语言实现
- 二叉树的前序、中序、后序、层次遍历的递归与非递归实现
- c++模板实现二叉树,线索化,线索化遍历,非递归遍历及一些基本操作
- 二叉树 前中后序遍历非递归版本 C++实现
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- C++实现——二叉树的四种遍历(非递归写法)
- 详细讲解二叉树三种遍历方式的递归与非递归实现
- C++实现二叉树的建立和三种递归遍历
- 详细讲解二叉树三种遍历方式的递归与非递归实现
- 二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 二叉树的遍历(C++非递归实现)
- 探讨:C++实现链式二叉树(用非递归方式先序,中序,后序遍历二叉树)
- 有关二叉树的相关实现:建树,遍历(递归与非递归实现)
- leetcode笔试题二叉树的前序、中序、后序遍历的递归和循环c++实现
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果