数据结构:题目(4)遍历二叉树的四种方法: 依次是:层次、前序、中序、后序
2015-04-22 10:31
756 查看
/* 遍历二叉树的四种方法: 依次是:层次、前序、中序、后序。 */ #include<iostream> #include<queue> using namespace std; struct BSTreeNode { int m_nValue; BSTreeNode *m_pLeft; BSTreeNode *m_pRight; }; /* 建立二叉排序树 */ void addBSTreeNode(BSTreeNode *&pCurrent,int value)//在这个函数中会要改变指针值,一定要记得使用引用传递 { if (pCurrent==NULL) { BSTreeNode* pBSTree=new BSTreeNode(); pBSTree->m_nValue=value; pBSTree->m_pLeft=NULL; pBSTree->m_pRight=NULL; pCurrent=pBSTree; } else if (pCurrent->m_nValue<value) { addBSTreeNode(pCurrent->m_pRight,value); } else if (pCurrent->m_nValue>value) { addBSTreeNode(pCurrent->m_pLeft,value); } else { cout<<"node repeated"<<endl; } } //按层次遍历二叉树 void LevelTraverse(BSTreeNode *pRoot) { if(pRoot == NULL) return; queue<BSTreeNode *> nodeQueue; nodeQueue.push(pRoot); nodeQueue.push(NULL); //放入空结点,作为层的结束符 while(nodeQueue.size()) { BSTreeNode * pNode = nodeQueue.front(); //取队首元素 nodeQueue.pop(); //必须出队列 if(pNode)//该结点非空 { cout<<pNode->m_nValue<<' '; if(pNode->m_pLeft) //左子女 nodeQueue.push(pNode->m_pLeft); if(pNode->m_pRight) //右子女 nodeQueue.push(pNode->m_pRight); } //如果结点为空并且队列非空,则是一行访问结束,下一行的入队列结束,因此压入一个空指针 //若队列也是空,则说明已访问完毕 else if(nodeQueue.size()) { nodeQueue.push(NULL); cout<<endl; } } } //前序遍历 void preorderTraverse(BSTreeNode *pr) { if(pr==NULL) return; cout<<pr->m_nValue<<' '; if(pr->m_pLeft!=NULL) preorderTraverse(pr->m_pLeft); if(pr->m_pRight!=NULL) preorderTraverse(pr->m_pRight); } //中序遍历 void inorderTraverse(BSTreeNode *pr) { if(pr==NULL) return; if(pr->m_pLeft!=NULL) inorderTraverse(pr->m_pLeft); cout<<pr->m_nValue<<' '; if(pr->m_pRight!=NULL) inorderTraverse(pr->m_pRight); } //后序遍历 void postorderTraverse(BSTreeNode *pr) { if(pr==NULL) return; if(pr->m_pLeft!=NULL) postorderTraverse(pr->m_pLeft); if(pr->m_pRight!=NULL) postorderTraverse(pr->m_pRight); cout<<pr->m_nValue<<' '; } int main() { int arr[]={10,6,14,4,8,12,16}; BSTreeNode *pRoot=NULL; for(int i=0;i<sizeof(arr)/sizeof(*arr);i++) addBSTreeNode(pRoot,arr[i]);//创建二叉树 cout<<"Level Traverse:"<<endl; LevelTraverse(pRoot); cout<<endl<<"preorder Traverse:\t"; preorderTraverse(pRoot); cout<<endl<<"inorder Traverse:\t"; inorderTraverse(pRoot); cout<<endl<<"postorder Traverse:\t"; postorderTraverse(pRoot); cout<<endl; return 0; }
相关文章推荐
- 数据结构--java实现二叉树的先序、中序、后序、层次遍历及根据先序中序建立二叉树
- 数据结构-二叉树的前序、中序、后序、层次遍历
- 二叉树的先序、中序、后序遍历方法(递归与非递归方法)——《数据结构》
- 数据结构 ——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构 —— 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 树之二叉树的建立与四种遍历(前序,中序, 后序, 层次)及树的深度
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 树之二叉树的建立与四种遍历(前序,中序, 后序, 层次)及树的深度
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- Java实现二叉树的前序、中序、后序、层序遍历(递归方法)
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- [置顶] 数据结构之 二叉树的构造与遍历(先序,中序,后序,层次)
- 用递归方法对二叉树进行先序、中序和后序遍历
- 遍历二叉树(四种方式:前序、中序、后序、层序)
- 二叉树的遍历(前序、中序、后序、层次)
- 数据结构二叉树的实现,前序、中序、后序遍历
- 二叉树的遍历(前序、中序、后序、层次)
- 非递归遍历二叉树的四种策略-先序、中序、后序和层序