数据结构:题目(4)遍历二叉树的四种方法: 依次是:层次、前序、中序、后序

/*
遍历二叉树的四种方法:
依次是:层次、前序、中序、后序。
*/

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值