二叉树的三种遍历(前序,中序,后序)
来源:互联网 发布:图书数据加工公司招聘 编辑:程序博客网 时间:2024/05/21 01:49
void PreOrder(){ _PreOrder(_pRoot); cout<<endl;}
首先,创建二叉树
//-------------孩子表示法---------------//节点template <typename T>struct BinaryTreeNode{BinaryTreeNode(const T& value):_value(value),_pLeft(NULL),_pRight(NULL){} T _value; BinaryTreeNode<T>* _pLeft;//左孩子 BinaryTreeNode<T>* _pRight;//右孩子};
//二叉树template <class T>class BinaryTree{typedef BinaryTreeNode<T> Node;public:BinaryTree():_pRoot(NULL){}BinaryTree(const T* arr,size_t size,const T& invalid){ size_t index=0; _CreateBinaryTree(_pRoot,arr,size,index,invalid);}
private://创建树void _CreateBinaryTree(Node*& pRoot,const T* arr,size_t size,size_t& index,const T& invalid){ if(index<size && invalid!=arr[index]){ //根节点pRoot =new Node(arr[index]);//左子树_CreateBinaryTree(pRoot->_pLeft,arr,size,++index,invalid);//右子树_CreateBinaryTree(pRoot->_pRight,arr,size,++index,invalid);}}}
先序遍历:先访问根节点,接着访问左子树,再访问右子树以下用两种方法实现:
第一种:递归实现
/*先序遍历(根节点--左子树---右子树)*/private:void _PreOrder(Node* pRoot){ if(pRoot) { cout<<pRoot->_value<<" "; _PreOrder(pRoot->_pLeft); _PreOrder(pRoot->_pRight); } }
将上面的函数封装在下面的函数中public: void PreOrder(){ _PreOrder(_pRoot); cout<<endl;}
第二种:循环实现/*思路:根入栈--访问栈顶,出栈--右入栈--左入栈*/public:void PreOrder_Not(){ if(NULL ==_pRoot) return ; stack<Node*> s; s.push(_pRoot); while(!s.empty()) { Node* pTop=s.top(); cout<<pTop->_value<<" "; s.pop(); if(pTop->_pRight) s.push(pTop->_pRight); if(pTop->_pLeft) s.push(pTop->_pLeft); }cout<<endl;}中序遍历:访问顺序:左子树---根节点-----右子树
第一种:递归实现public: void InOrder(){_InOrder(_pRoot);cout<<endl;}/*中序遍历(左子树--根节点---右子树)*/private:void _InOrder(Node* pRoot){if(pRoot){ _InOrder(pRoot->_pLeft); cout<<pRoot->_value<<" "; _InOrder(pRoot->_pRight);}}第二种:循环实现
public:void InOrder_Nor(){ stack<Node*> s;Node* pCur=_pRoot;while(pCur||!s.empty()){//找到最左边的节点,记录做过的节点 while(pCur) { s.push(pCur); pCur=pCur->_pLeft; } //访问节点 pCur=s.top(); cout<<pCur->_value<<" "; s.pop(); //访问右子树 pCur=pCur->_pRight;} cout<<endl;}后序遍历:访问顺序:左子树---右子树----根节点
第一种:递归实现
public: void PostOrder(){_PostOrder(_pRoot);cout<<endl;}
/*后序遍历(左子树---右子树----根节点)*/private:void _PostOrder(Node* pRoot){ if(pRoot) { _PostOrder(pRoot->_pLeft); _PostOrder(pRoot->_pRight); cout<<pRoot->_value<<" "; }}第二种:循环实现
public: void PostOrder(){_PostOrder(_pRoot);cout<<endl;}//非递归:void PostOrder_Nor(){ if(NULL == _pRoot) return ; stack<Node*> s; Node* pCur=_pRoot; Node* prev=NULL; //找最左边的节点,并记录路径上的所有节点 while(pCur||!s.empty()) { while(pCur) { s.push(pCur); pCur=pCur->_pLeft; } //取栈顶 Node* pTop=s.top();//右子树不存在 if(NULL == pTop->_pRight ||prev==pTop->_pRight) { cout<<pTop->_value<<" "; prev=pTop; s.pop(); }//右子树存在 else pCur=pTop->_pRight; } cout<<endl;}
0 0
- 二叉树的三种遍历(前序,中序,后序)
- 二叉树的前序、中序、后序遍历的三种方法
- 二叉树的三种遍历方式,前序、中序和后序。
- 二叉树的遍历(前、中、后序)
- 二叉树的遍历(前序遍历、中序遍历、后序遍历)
- 二叉树的前序遍历,中序遍历和后序遍历(c#)
- 二叉树的遍历,二叉树的创建、前序遍历、中序遍历、后序遍历 (转)
- 二叉树的前序、中序、后序遍历
- 二叉树的遍历(前序,中序,后序)
- 二叉树的遍历:前序、中序、后序
- 二叉树的前序、中序、后序遍历
- 二叉树的前序、中序、后序遍历
- 二叉树的前序,中序,后序遍历
- 二叉树的前序、中序、后序遍历
- 二叉树的前序,中序,后序遍历
- 二叉树的前序、中序、后序遍历
- 二叉树的前序、中序、后序遍历
- 二叉树的前序、中序、后序遍历
- Binder机制-简单用法(一)
- 利用jquery ui实现微信底部的二级下拉菜单
- CenOS7上网络组team的实现
- 系列:1到1000中包含8的个数
- Kubernetes1.6安装指南 (二进制文件方式)
- 二叉树的三种遍历(前序,中序,后序)
- STL的next_permutation函数
- Java基本数据类型转换
- vijos P1005 超长数字串 解题报告
- Mask RCNN in TensorFlow
- 关于js中两种定时器的设置及清除
- 系统监控利器-dstat命令(1)
- 面试准备
- HDU6027-Easy Summation-简单数学