二叉樹的層遍歷又可以成爲廣度優先遍歷,廣度優先通常都可以利用隊列來解決:首先把根節點加入隊列,然後判斷隊列是否爲空,若非空就把隊頭元素作爲當前節點,然後依次判斷當前節點的左右子節點是否爲空,若非空則加入隊列;循環上述過程,直到隊列爲空。代碼如下:
#include "stdafx.h"
#include<iostream>
#include <queue>
#include <vector>
using namespace std;
typedef struct binary_tree_node
{
struct binary_tree_node* left;
struct binary_tree_node* right;
int data;
}Binary_Tree_Node;
void visit(Binary_Tree_Node* pNode)
{
if (pNode!=NULL)
{
cout<<pNode->data<<" ";
}
}
Binary_Tree_Node* create_tree(vector<int> dataVec);
void insert_node(Binary_Tree_Node* root,int data);
void level_order(Binary_Tree_Node* root);
void free_node(Binary_Tree_Node* root);
int _tmain(int argc, _TCHAR* argv[])
{
int tmpArray[]={1,2,3,4,5,6,7,};
vector<int> input(tmpArray,tmpArray+7);
Binary_Tree_Node *root=create_tree(input);
level_order(root);
free_node(root);
return 0;
}
Binary_Tree_Node* create_tree(vector<int> dataVec)
{
if (dataVec.size()==0)
{
return nullptr;
}
Binary_Tree_Node *root=new Binary_Tree_Node();
root->left=NULL;
root->right=NULL;
root->data=dataVec[0];
for (int i=1;i<dataVec.size();++i)
{
insert_node(root,dataVec[i]);
}
return root;
}
void insert_node(Binary_Tree_Node* root,int data)
{
if (root->left==NULL)
{
Binary_Tree_Node* leftChild=new Binary_Tree_Node();
leftChild->left=NULL;
leftChild->right=NULL;
leftChild->data=data;
root->left=leftChild;
return;
}
if (root->right==NULL)
{
Binary_Tree_Node* leftChild=new Binary_Tree_Node();
leftChild->left=NULL;
leftChild->right=NULL;
leftChild->data=data;
root->right=leftChild;
return;
}
insert_node(root->left,data);
}
void level_order(Binary_Tree_Node* root)
{
if (root==NULL)
{
return;
}
queue<Binary_Tree_Node*> pQueue;
pQueue.push(root);
while(!pQueue.empty())
{
Binary_Tree_Node *curNode=pQueue.front();
pQueue.pop();
visit(curNode);
if (curNode->left!=NULL)
{
pQueue.push(curNode->left);
}
if (curNode->right!=NULL)
{
pQueue.push(curNode->right);
}
}
}
void free_node(Binary_Tree_Node* root)
{
if (root->left!=NULL)
{
free_node(root->left);
}
if (root->right!=NULL)
{
free_node(root->right);
}
delete root;
root=NULL;
}
上述程序生成的二叉樹如下圖:
層遍歷程序結果如下: