您的位置:首页 > 理论基础 > 数据结构算法

数据结构:题目(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐