查看逆序的BSF输出如图所示:
这里,我们首先创建一颗二叉树,并使用先序遍历,依次计算其中每个节点的深度,其次利用BSF算法,利用deque获得序列,但同时使用vector只进行push_back无pop_front
这样,vector中就是根据BSF优先算法获得的序列,但还是没有逆序,就利用深度的不同获得,依次递减,进行输出:
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<deque>
using namespace std;
struct Node{
char val;
int Depth;
Node* left;
Node* right;
Node(char x=0):val(x),left(NULL),right(NULL),Depth(0){
}
};
Node* g_root;
vector<Node*>g_vec;
int GetNodeDepth(Node* root,Node* cur,int layer)
{
int i=-1;
if(NULL!=root)
{
if(root==cur)
{
return layer;
}
i=GetNodeDepth(root->left,cur,layer+1);
if(i!=-1)
{
return i;
}
i=GetNodeDepth(root->right,cur,layer+1);
if(i!=-1)
return i;
}
return i;
}
void Travel(Node* root)
{
if(NULL==root)
{
return ;
}
int depth=GetNodeDepth(g_root,root,0);
root->Depth=depth;
Travel(root->left);
Travel(root->right);
}
void BSF(Node* root)
{
if(NULL==root)
{
return;
}
deque<Node*>deq;
deq.push_back(root);
g_vec.push_back(root);
while(!deq.empty())
{
Node* tmp=deq.front();
deq.pop_front();
if(tmp->left!=NULL)
{
deq.push_back(tmp->left);
g_vec.push_back(tmp->left);
}
if(tmp->right!=NULL)
{
deq.push_back(tmp->right);
g_vec.push_back(tmp->right);
}
}
}
int main()
{
Node *tmp ;
Node* root = new Node('A');
g_root=root;
tmp = new Node('B');
root->left = tmp ;
tmp = new Node('C');
root->right = tmp;
tmp = new Node('D');
root->left->right = tmp;
tmp = new Node('E');
root->right->left = tmp;
tmp=new Node('F');
root->right->right=tmp;
tmp=new Node('G');
root->right->left->left=tmp;
tmp=new Node('H');
root->right->left->right=tmp;
//首先遍历整个二叉树,同时填充深度
Travel(g_root);
//使用BSF光度优先算法进行g_vec的填充
BSF(g_root);
//逆序输出
vector<Node*>::reverse_iterator pitr=g_vec.rbegin();
int cur=(*pitr)->Depth;
for(int i=cur;i>=0;i--)
{
vector<Node*>::iterator itr=g_vec.begin();
for(itr=g_vec.begin();itr!=g_vec.end();itr++)
{
if(i==(*itr)->Depth)
{
cout<<(*itr)->val<<" ";
}
}
cout<<endl;
}
return 0;
}