DFS序

DFS序:就是将树形结构转化为线性结构,用dfs遍历一遍这棵树,进入到x节点有一个in时间戳,递归退出时有一个out
时间戳,x节点的两个时间戳之间遍历到的点,就是根为x的子树的所有节点。

问题:求下图的DFS序
在这里插入图片描述

#include<iostream>
#include<vector>
 
#define max(x,y) (x > y ? x : y)

using namespace std;

int time = 0;

int in[10];
int out[10];
int carr[50];

vector<int> vct[10];

void dfs(int x,int fa){
	in[x] = ++time;
	carr[time] = x;
	for(int i = 0;i < vct[x].size();i++){
		int cnt  = vct[x][i];
		if(cnt == fa){
			continue;
		}
		dfs(cnt,x);
	}
	out[x] = time; 
}

int main(){
	vct[0].push_back(1);
	vct[0].push_back(2);
	vct[1].push_back(3);
	vct[1].push_back(4);
	vct[2].push_back(5);
	vct[2].push_back(6);
	vct[2].push_back(7);
	vct[4].push_back(8);
	dfs(0,-1);
	cout<<"in[]:";
	for(int i = 0;i <10;i++){
		cout<<in[i]<<" ";
	}
	cout<<endl;
	cout<<"out[]:";
	for(int i = 0;i < 10;i++){
		cout<<out[i]<<" "; 
	} 
	cout<<endl;
	cout<<"carr[]:";
	for(int i = 0;i < 20;i++){
		cout<<carr[i]<<" ";
	}
	cout<<endl;
	//求以2为根节点的子树 
	for(int i = in[2]; i <= out[2];i++){
		cout<<carr[i]<<" ";
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值