c#如何实现树的深度优先遍历
发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,这篇文章主要介绍了c#如何实现树的深度优先遍历,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。树的深度优先遍历首先,我们定义树结点:pu
千家信息网最后更新 2024年12月12日c#如何实现树的深度优先遍历
这篇文章主要介绍了c#如何实现树的深度优先遍历,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
树的深度优先遍历
首先,我们定义树结点:
public class Node { public Node(long value, bool visited) { Value = value; Visited = visited; } public long Value { get; set; }//存放结点的值 public bool Visited { get; set; } }
然后,我们就可以愉快地上DFS的栈写法啦
public static long Fblc(int n) { Stacks = new Stack (); s.Push(new Node(n, false)); long sum = 0; long[] childrenResultMemo = new long[n+1]; childrenResultMemo[0] = 1; childrenResultMemo[1] = 1; //long children = 0; while (s.Any()) { var cur = s.Pop(); if (cur.Visited == false) { if (childrenResultMemo[cur.Value] == 0) { cur.Visited = true; if (childrenResultMemo[cur.Value - 1] != 0 && childrenResultMemo[cur.Value - 2] != 0) { var result = childrenResultMemo[cur.Value - 1] + childrenResultMemo[cur.Value - 2]; childrenResultMemo[cur.Value] = result; sum += result; s.Push(cur); } else { s.Push(cur); s.Push(new Node(cur.Value - 1, false)); s.Push(new Node(cur.Value - 2, false)); } } else { sum += childrenResultMemo[cur.Value];//保存子树结果的优化,会有个特殊情况要处理 } } } return sum; }
上述算法的核心思想是,遍历栈,pop出栈顶元素,如果已经访问过(visited为true),就跳过(上面代码由于采用了保存子树结果的优化,会有个特殊情况要处理,下文会详述);否则,将当前父结点的visited标记为true,代表已访问过,并push到栈;然后将其子结点都push到栈。
如果按照这个思路,写出来的代码不会是上面那个样子的,代码量少得多也简洁得多,不过算法复杂度就会像递归写法差不多,因为存在重复计算。
那怎么办呢,解决办法只有一个,空间换时间,将子树的结果存起来,如果对应子树已经计算过有结果,就不再往下一层的深度遍历了,直接使用结果。我们将子树结果保存在了一个数组里面:
long[] childrenResultMemo = new long[n+1];
通常如果子树已经有结果,按逻辑来说应该就会被访问过。不过存在特例,就是一开始的子树0和子树1:
childrenResultMemo[0] = 1;childrenResultMemo[1] = 1;
只需在这个特例的分支里面累加结果即可:
sum += childrenResultMemo[cur.Value];
感谢你能够认真阅读完这篇文章,希望小编分享的"c#如何实现树的深度优先遍历"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
结果
子树
深度
篇文章
结点
代码
c#
特殊
写法
情况
特例
算法
处理
复杂
愉快
简洁
差不多
下文
代表
价值
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
sql数据库工具大全
智能化计算机网络技术创新服务
北京网络技术院校
数据库原理及技术尹为民
数据库技术与应用a卷答案
游戏开服一个服务器要多少钱
战地1怎么举报服务器
计算机网络技术和药剂学哪个好
怎么连接不上远程服务器
无锡捷普绿点软件开发
网络祭祖软件开发
大嘉网络技术有限公司
发改局网络安全责任制考核
保定中阅互联网科技
数据库如何搜集所有指定数据
梦三国2在哪个国家有服务器
奉贤区通信网络安全防护标准
数据库pass是啥
服务器如何搭建微信公众平台
服务器检测内存报错
战地1怎么举报服务器
戴尔文件服务器硬件配置方案
tomcat图片服务器
tcp服务器和客户端
网络安全公需课考试试卷
网吧里面的免费网络安全吗
将服务器映射到外网安全吗
网络安全邀请函讲解
电力系统网络安全新技术
服务器如何搭建微信公众平台