用dfs序维护树结构
2016-01-22 13:23
295 查看
http://blog.csdn.net/ccsu_001/article/details/47667587
给定一棵n个节点的树,m次查询,每次查询需要求出某个节点深度为h的所有子节点。
对于这个问题如果试图去对每个节点保存所有深度的子节点,在数据大的时候内存会吃不消;或者每次查询的时候去遍历一遍,当数据大的时候,时间效率会非常低。
此时如果使用dfs序维护树结构就可以轻松地解决这个问题。
作为预处理,首先将将树的所有节点按深度保存起来,每个深度的所有节点用一个线性结构保存,每个深度的节点相对顺序要和前序遍历一致。
然后从树的根节点进行dfs,对于每个节点记录两个信息,一个是dfs进入该节点的时间戳in[id],另一个是dfs离开该节点的时间戳out[id]。
最后对于每次查询,求节点v在深度h的所有子节点,只需将深度为h并且dfs进入时间戳在in[v]和out[v]之间的所有节点都求出来即可,由于对于每个深度的所有节点,相对顺序和前序遍历的顺序以致,那么他们的dfs进入时间戳也是递增的,于是可以通过二分搜索求解。
给定一棵n个节点的树,m次查询,每次查询需要求出某个节点深度为h的所有子节点。
对于这个问题如果试图去对每个节点保存所有深度的子节点,在数据大的时候内存会吃不消;或者每次查询的时候去遍历一遍,当数据大的时候,时间效率会非常低。
此时如果使用dfs序维护树结构就可以轻松地解决这个问题。
作为预处理,首先将将树的所有节点按深度保存起来,每个深度的所有节点用一个线性结构保存,每个深度的节点相对顺序要和前序遍历一致。
然后从树的根节点进行dfs,对于每个节点记录两个信息,一个是dfs进入该节点的时间戳in[id],另一个是dfs离开该节点的时间戳out[id]。
最后对于每次查询,求节点v在深度h的所有子节点,只需将深度为h并且dfs进入时间戳在in[v]和out[v]之间的所有节点都求出来即可,由于对于每个深度的所有节点,相对顺序和前序遍历的顺序以致,那么他们的dfs进入时间戳也是递增的,于是可以通过二分搜索求解。
相关文章推荐
- Linux strace命令
- Linux简介及Ubuntu安装
- Linux分区
- 如何直接维护一个已经存在的透明表(转账表)
- MySql—Linux下安装MySql
- 使用Myeclipse自带Tomcat在JSP中访问数据库
- CentOS 6.5 X64 JAVA环境配置(JDK+TOMCAT+NGINX)
- myeclipse maven tomcat插件 创建web工程
- opencv实现最基本的图像配准
- Verilog中$fopen $fdisplay $fclose的用法
- Open /dev/ttyUSB* with not a root user method
- zabbix 监控 nginx
- 深入理解RunLoop
- Linux下防火墙开启相关端口及查看已开启端口
- apache commons io 最佳实践
- Eclipse Tomcat 启动报错 45s
- bash变量简介-56
- Tomcat设置解决乱码问题
- Eclipse中Tomcat的使用图文教程
- nginx windows版本 1024限制