广度优先遍历二叉树(从上到下遍历二叉树)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_33442459/article/details/73287471

问题描述:从上到下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如下图中的二叉树 ,则依次打印出8,6,10,5,7,9,11

这里写图片描述

思路分析:按层打印的顺序决定了应该先打印根节点,所以我们从树的根节点开始分析,为了接下来能够打印值为8的结点的两个子结点,我们应该在遍历到该结点时把值为6和10的两个结点保存到一个容器里,现在容器内就有两个结点了。按照从左到右的打印,我们先取出值为6的结点,打印出值6之后把它的值分别为5和7的两个结点放入数据容器。此时数据容器中有3个结点,值分别为10,5,7。接下来我们从数据容器中取出值为10的结点。注意到值为10的结点比值为5,7的结点先放入容器中,此时又比这两个结点先取出,这就是先入先出。因此,不难看出这个数据容器应该就是一个队列。由于值为5,7,9,11的结点都没有子结点,因此只要依次打印即可。

完整代码:

#include<iostream>
#include<deque>
using namespace std;

typedef struct BinaryTreeNode{
     int m_nValue;
     BinaryTreeNode* m_pLeft;
     BinaryTreeNode* m_pRight;
};

//创建一颗二叉树
void CreateBinaryTreeNode(BinaryTreeNode* &pCurrent,int value)
{
   if(pCurrent==NULL)
   {
      BinaryTreeNode* pNode=new BinaryTreeNode();
      if(pNode==NULL)
      {
         throw exception("Allocate Failure");
      }
      pNode->m_pLeft=NULL;
      pNode->m_pRight=NULL;
      pNode->m_nValue=value;
      pCurrent=pNode;
   }
   else{
       if(pCurrent->m_nValue>value)
       {
          CreateBinaryTreeNode(pCurrent->m_pLeft,value);
       }
       else if(pCurrent->m_nValue<value)
       {
          CreateBinaryTreeNode(pCurrent->m_pRight,value);
       }
       else{
          cout<<"重复加入结点"<<endl;
       }
   }
}

//核心代码:从上到下打印二叉树
void PrintFromTopToBottom(BinaryTreeNode* pTreeNode)
{
    if(pTreeNode==NULL)
    {
        return;
    }
    deque<BinaryTreeNode*> dequeTreeNode;
    dequeTreeNode.push_back(pTreeNode);//头结点放入队列中
    while(dequeTreeNode.size())//循环取出结点
    {
        BinaryTreeNode* pNode=dequeTreeNode.front();//取出队列中的第一个元素
        dequeTreeNode.pop_front();//第一个元素出队列
        cout<<pNode->m_nValue<<"\t";
        if(pNode->m_pLeft)
        {
           dequeTreeNode.push_back(pNode->m_pLeft);
        }
        if(pNode->m_pRight)
        {
           dequeTreeNode.push_back(pNode->m_pRight);
        }      
    }
}


//前序遍历
void PreOrderTraverseTree(BinaryTreeNode* pRoot)
{
    if(pRoot==NULL)
    {
       return;
    }
    cout<<pRoot->m_nValue<<"\t";
    PreOrderTraverseTree(pRoot->m_pLeft);
    PreOrderTraverseTree(pRoot->m_pRight);
}

//中序遍历
void InorderTraverseTree(BinaryTreeNode* pRoot)
{
    if(pRoot==NULL)
    {
        return;
    }
    InorderTraverseTree(pRoot->m_pLeft);
    cout<<pRoot->m_nValue<<"\t";
    InorderTraverseTree(pRoot->m_pRight);
}

//后序遍历
void PastorderTraverseTree(BinaryTreeNode* pRoot)
{
    if(pRoot==NULL)
    {
        return;
    }
    PastorderTraverseTree(pRoot->m_pLeft);
    PastorderTraverseTree(pRoot->m_pRight);
    cout<<pRoot->m_nValue<<"\t";
}


int main()
{
   BinaryTreeNode* pRoot=NULL;
   CreateBinaryTreeNode(pRoot,8);
    CreateBinaryTreeNode(pRoot,6);
    CreateBinaryTreeNode(pRoot,5);
    CreateBinaryTreeNode(pRoot,7);
    CreateBinaryTreeNode(pRoot,10);
    CreateBinaryTreeNode(pRoot,9);
    CreateBinaryTreeNode(pRoot,11);
    cout<<"前序遍历:"<<endl;
    PreOrderTraverseTree(pRoot);
    cout<<endl;
    cout<<"中序遍历:"<<endl;
    InorderTraverseTree(pRoot);
    cout<<endl;
    cout<<"后序遍历:"<<endl;
    PastorderTraverseTree(pRoot);
    cout<<endl;
    cout<<"从上往下打印二叉树"<<endl;
    PrintFromTopToBottom(pRoot);
    cout<<endl;
    system("pause");
    return 0;
}

结果如下图:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/sinat_33442459/article/details/73287471