L2-006 树的遍历

详细注释,兄弟们,冲!

受益匪浅:

1:图(树)的构建:(根据中序,和后序)(中序,和后序原理都一样)

int build_tree(int l1,int r1,int l2,int r2){//构建树 
	if(l1>r1||l2>r2){//结束 
		return 0;
	}
	int root=last[r2];//当前根节点
	int p=l1;//从mid中找
	while(mid[p]!=root)p++;//知道找到root(当前根节点的位置)
	int cnt=p-l1;
	t[root].l=build_tree(l1, p-1,l2,l2+cnt-1);//构建左子树 
	t[root].r=build_tree(p+1,r1,l2+cnt,r2-1); //构建右子树 
	return root;//返回根节点 
}

2:如何进行层序遍历:

void dfs(int root){//层序遍历 
	queueq;//用到队列 
	q.push(root);//第一个根根节点入队 
   int flag=true;
   
   while(q.size()){
   	int tt=q.front();
   	q.pop();
   	if(flag){//最后不能有多余空格,这样操作很巧妙,爱了爱了 
   		cout<

3:(处理输出末行不能多出空格的情况) 

(第一个数只输出本身,后来都是先输出一个空格再输出本身)

int flag=true;


if(flag){//最后不能有多余空格,这样操作很巧妙,爱了爱了 
   		cout<

 最后是ACcode:(详细注释,安全食用~)

#include
#include
using namespace std;
const int N =30+5;
struct T{//构建树 
	int l,r;
}t[N];

int mid[N],last[N],n;//中序,后序,n 
int build_tree(int l1,int r1,int l2,int r2){//构建树 
	if(l1>r1||l2>r2){//结束 
		return 0;
	}
	int root=last[r2];//当前根节点
	int p=l1;//从mid中找
	while(mid[p]!=root)p++;//知道找到root(当前根节点的位置)
	int cnt=p-l1;
	t[root].l=build_tree(l1, p-1,l2,l2+cnt-1);//构建左子树 
	t[root].r=build_tree(p+1,r1,l2+cnt,r2-1); //构建右子树 
	return root;//返回根节点 
}
void dfs(int root){//层序遍历 
	queueq;//用到队列 
	q.push(root);//第一个根根节点入队 
   int flag=true;
   
   while(q.size()){
   	int tt=q.front();
   	q.pop();
   	if(flag){//最后不能有多余空格,这样操作很巧妙,爱了爱了 
   		cout<>n;
    for(int i=1;i<=n;i++){
    	cin>>last[i];
	}
	for(int i=1;i<=n;i++){
		cin>>mid[i];
	}
	int root=build_tree(1,n,1,n);//构建树 
	dfs(root); //层序遍历打印 
	return 0;
}

over~,点赞点赞

你可能感兴趣的:(深度优先,图论,算法)