dfs序(树形结构线性化)

本文介绍了一种将树形结构转化为线性结构的方法——DFS序。详细解释了DFS序的概念及其在树上的应用,并通过示例展示了如何利用DFS序对树进行有效操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dfs序是将树形结构转换为线性结构的一种方式。

dfs序
dfs序: 指每个节点在dfs深度优先遍历中的进出栈的时间序列。
定义三个数组:
in[x]:表示结点x 入栈的时间戳。
out[x]:表示结点x出栈的时间戳,特殊的,出栈不算时间。
id[x]:表示结点x在新的线性序列中的下标, id[x]=in[x]。

在这里插入图片描述
dfs访问顺序为:A,B,E,F,K,C,G,H,I
则结点的入栈出栈时间如下:
在这里插入图片描述
这样,我们得到一个新的线性序列:
A,B,E,F,K,C,G,H,I
通过观察可以发现,以x 为根的子树在一个连续的区间,即在x 入栈和出栈之间,因此,如果要对子树进行操作,可以看作对一个区间进行操作,且这个区间对应新的线性序列中的in[x] out[x]。

支持两种操作:
单个结点修改
对单个结点x进行修改,则对应新的线性序列对id[x]进行修改。
对x为根的子树进行修改
如对结点B根的子树进行操作,则对应线性序列区间in[B] out[B],即区间[2,5]进行操作。

void dfs(int u)
{
    inn[u]=++num;	//入栈时间
    s[u]=num;	//新的线性序列 
    vis[u]=1;
    for(int i=first[u];i!=-1;i=nex[i])
    {
        int v=to[i];
        if(!vis[v]) dfs(v);
    }
    outt[u]=num;	//出栈时间,不计算时间
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值