树的dfs序

1.什么时候用dfs序

树的dfs序就是用来维护一系列树上的问题的,这类问题主要是解决一棵树上的所有后代结点信息的更改和祖先结点有关,主要先通过dfs来记录一个树的每一个顶点的出入时间戳,来控制它子树上的所有结点的状态的更新。用L[],R[]来记录这个祖先结点控制后代结点的区间。

即dfs序的特点就是:一棵子树的dfs序就变成了一个区间;

2.dfs序的作用

*相当于把树上的问题转化成了序列上的问题

*辅以各种数据结构(ST表、树状数组、线段树)进行运算

*子树求和->区间求和

3.dfs序详解



4.dfs序代码:

void dfs(int x,int pre,int d){//L,R表示一个子树的范围  
    L[x]=++tot;  
    dep[x]=d;  
    for(int i=0;i<e[x].size();i++){  
        int y=e[x][i];  
        if(y==pre)continue;  
        dfs(y,x,d+1);  
    }  
    R[x]=tot;  
}  
建议用代码模拟过程一波;
5.例题:poj3321 Apple Tree 

链接:点击打开链接












/****参考资料:****/

*http://www.cnblogs.com/bytebull/p/5929137.html(给定一颗树, 和每个节点的权值.下面有7个经典的关于dfs序的问题);

*https://acm.sjtu.edu.cn/w/images/3/35/%E6%A0%91%E7%9A%84dfs%E5%BA%8F%E5%8F%8A%E5%85%B6%E5%BA%94%E7%94%A8%EF%BC%88%E9%97%AB%E9%B8%BF%E5%AE%87%EF%BC%89.pdf

*http://www.dbwater.net/2016/08/26/dfsx/(codeforces C题)

*http://www.voidcn.com/blog/qq_24489717/article/p-5001355.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用深度优先搜索(DFS)遍历的每个节点,并将每个节点按照遍历顺添加到一个列表中。然后,我们可以对列表进行分组,每个组包含三个节点。以下是示例代码: ```python def group_nodes(root): # 深度优先搜索遍历节点 node_list = [] stack = [root] while stack: node = stack.pop() node_list.append(node) for child in node.children: stack.append(child) # 将节点列表分组 groups = [] n = len(node_list) for i in range(0, n, 3): group = node_list[i:i+3] groups.append(group) return groups ``` 在上述代码中,我们首先使用DFS遍历,并将每个节点添加到`node_list`中。然后,我们使用`range`和切片操作将`node_list`中的节点分成大小为3的组,并将每个组添加到`groups`列表中。最后,我们返回`groups`列表作为结果。 ### 回答2: 给定一颗,要把节点三个三个分为一组,可以按以下步骤进行: 1. 遍历进行节点的编号:从根节点开始,按照一定的遍历方式(如深度优先遍历)对进行遍历,为每个节点进行编号。 2. 根据节点的编号进行分组:将所有节点的编号按照升排列,并按照顺将节点分成连续的三个一组。若节点数量不能被三整除,则最后一组可以少于三个节点。 3.输出每组节点:按照每组的顺输出每组节点的编号,形成分组结果。 举例说明: 假设给定一棵二叉,节点编号为1-7。将节点三个三个分为一组的步骤如下: 1. 进行节点编号:根节点编号为1,左子节点为2,右子节点为3,左子节点的左子节点为4,左子节点的右子节点为5,右子节点的左子节点为6,右子节点的右子节点为7。 2. 根据节点编号进行分组:按照升对节点编号进行排,得到排后的节点编号列为1,2,3,4,5,6,7。将其分成连续的三个一组:(1,2,3),(4,5,6),(7)。 3. 输出每组节点:分组结果为:第一组(1,2,3),第二组(4,5,6),第三组(7)。 以上就是将给定的节点三个三个分为一组的过程。 ### 回答3: 给定一颗,将节点三个三个分为一组的方法如下: 首先,遍历,找到所有的节点,并统计节点的数量n。 然后,根据节点数量n计算出分组的组数m,即m = n / 3。 接下来,将这些节点进行编号,编号从1到n。 然后,按照以下步骤进行分组: 1. 创建一个空的结果列表result。 2. 从编号为1的节点开始,将节点添加到一个临时列表temp中。 3. 当temp中的节点数量达到3个时,将temp添加到result中,并清空temp。 4. 重复步骤2和步骤3,直到遍历完所有的节点。 5. 如果最后一个temp不满足3个节点,将其剩余的节点添加到result中。 最后,得到的结果列表result中的每个元素都是三个节点的分组。 需要注意的是,如果节点数量n不是3的倍数,那么最后一个组可能没有满三个节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值