您的位置:首页 > 其它

逆序的BSF输出

2015-08-04 19:27 204 查看
查看逆序的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;  
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: