c#如何实现树的深度优先遍历
发表于:2025-11-21 作者:千家信息网编辑
千家信息网最后更新 2025年11月21日,这篇文章主要介绍了c#如何实现树的深度优先遍历,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。树的深度优先遍历首先,我们定义树结点:pu
千家信息网最后更新 2025年11月21日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) { Stack s = 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安全错误
数据库的锁怎样保障安全
unity服务器托管
连云港在线联想服务器安装
软件开发有限公司如何
什么是护苗网络安全宣传周
方舟手游怎么清除服务器
现代软件开发厂家直销
企业办公软件开发
万能钥匙的数据库
数据库的两种建立方式
服务器故障404
部队网络安全格言
金山区环保网络技术解决方案
天象网络技术电话
学软件开发学几年
盗版软件开发的软体
杭州驭宝网络技术靠谱吗
网络安全时事件
超微服务器远程管理KVM
专科计算机网络技术大一教材
APP自带数据库
小松鼠数据库
类似微信聊天软件开发
dna数据库的建设及应用
网络安全与信息化的核心内容
mc最安全的服务器
如何防范网络安全行为
易语言建立网络数据库
工程计算软件开发教程
地铁数据库信息
网线服务器闪黄灯是什么原因