c#如何实现树的深度优先遍历
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要介绍了c#如何实现树的深度优先遍历,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。树的深度优先遍历首先,我们定义树结点:pu
千家信息网最后更新 2025年01月23日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安全错误
数据库的锁怎样保障安全
计算机软件开发纠纷的级别管辖
巴中网络技术发展
软件开发公司要缴纳税吗
阿尔法家拆单软件无法连接服务器
嵌入式软件开发关键技术
上传文件服务器需要ip
世界网络安全大赛ctf冠军
服务器远程管理叫什么
河南最好的服务器托管公司云主机
网络安全周活动精彩
福建什么软件开发服务值得推荐
磁带机备份需要备份服务器吗
数据库迁移有哪些方式
青岛企业软件开发流程
杭州检修软件开发
数据库同义词的优势
浙江迈田网络技术有限
咪咕音乐网络安全
河北正规软件开发项目信息
顺义区综合软件开发介绍
浙江运营软件开发供应
ps5连接不上2k服务器
好用的数据库建模工具
数据库删除相同属性
软件开发对笔记本电脑的要求
小学网络安全重大事项报告制度
数据库的物理层
数据库不具备什么
建立健全作业队伍安全资信数据库
火山云数据库