首页 > 其他分享 >深度优先搜索在树状数据结构中的应用

深度优先搜索在树状数据结构中的应用

时间:2024-03-13 17:11:05浏览次数:15  
标签:优先 DisplayName 树状 搜索 matchingItems var new 数据结构 节点

深度优先搜索(DFS)是一种经典的树和图的遍历算法。它通过一条路径尽可能深地搜索树的分支,当节点v的所在边已经被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。

以下是使用DFS在树状数据结构中搜索包含特定关键字的节点的一个典型实现:

 1 using System;
 2 using System.Collections.Generic;
 3 
 4 public class TreeSearch
 5 {
 6     public static void Main()
 7     {
 8         // 假设这是树的根节点
 9         var rootNode = new Node { DisplayName = "Root", Children = new List<Node>() };
10 
11         // 添加一些示例节点
12         rootNode.Children.Add(new Node { DisplayName = "Child1", Children = new List<Node>() });
13         rootNode.Children.Add(new Node { DisplayName = "Child2", Children = new List<Node>() });
14 
15         // 调用搜索函数,搜索包含"keyword"的节点
16         var matchingItems = SearchNodesContaining(rootNode, "keyword");
17 
18         // 输出匹配的节点
19         foreach (var item in matchingItems)
20         {
21             Console.WriteLine(item.DisplayName);
22         }
23     }
24 
25     // 搜索包含特定关键字的节点的函数
26     private static List<Node> SearchNodesContaining(Node node, string searchTerm)
27     {
28         var matchingItems = new List<Node>();
29         var searchStack = new Stack<Node>();
30         
31         searchStack.Push(node);
32 
33         while (searchStack.Count > 0)
34         {
35             var currentNode = searchStack.Pop();//弹栈
36             
37             if (currentNode.DisplayName.Contains(searchTerm))
38             {
39                 matchingItems.Add(currentNode);
40             }
41 
42             foreach (var child in currentNode.Children)
43             {
44                 searchStack.Push(child);//压栈,递归遍历,将不同层级的节点循环插入此栈中,让最下层的子节点在栈的最上面,实现深度优先搜索
45             }
46         }
47 
48         return matchingItems;
49     }
50 }
51 
52 // 定义树节点的类
53 public class Node
54 {
55     public string DisplayName { get; set; }
56     public List<Node> Children { get; set; } = new List<Node>();
57 }

在上述代码中,我们首先定义了一个Node类来表示树中的节点,其中包含节点的名称和子节点列表。然后在Main方法中创建了一个树的示例结构,并调用了SearchNodesContaining方法来搜索包含特定关键字的节点。

SearchNodesContaining方法接收一个节点和一个要搜索的关键字作为参数,并返回一个包含所有匹配节点的列表。方法内部使用了一个栈searchStack来存储待访问的节点,并通过一个while循环来遍历整个树。如果当前节点的DisplayName包含搜索关键词,则将该节点加入到matchingItems列表中。同时,还会遍历当前节点的所有子节点,并将它们压入栈中,以便后续处理。

最后,我们遍历并输出matchingItems列表中的所有节点名称,这些节点都是包含指定关键字的。通过这种方式,DFS帮助我们高效地在树状数据结构中找到所需的信息。

 

补充说明:栈(Stack)是一种特殊的线性数据结构,其特点是只能在一端(称为栈顶)进行添加或删除操作,遵循后进先出(LIFO,Last In First Out)的原则。这意味着最后一个进入栈的元素总是第一个被取出。


         栈的主要特性包括:


  1. 后进先出:栈的顶部是最新的元素,每次添加或删除操作都在栈顶进行。

  2. 单一入口出口:栈只有一个入口和一个出口,即栈顶。

  3. 栈顶指针:栈通常使用一个指针来指向栈顶元素。

  4. 栈的存储结构:栈可以使用数组或者链表来实现,但最常见的是使用数组来实现。

  5. 栈的操作:栈的基本操作包括压栈(push)、弹栈(pop)、查看栈顶元素(peek)、判断栈是否为空(isEmpty)等。


栈的应用非常广泛,例如在计算机程序设计中,函数调用、递归、表达式求值、状态机等都离不开栈的使用。


标签:优先,DisplayName,树状,搜索,matchingItems,var,new,数据结构,节点
From: https://www.cnblogs.com/ITjyLh/p/18071071

相关文章

  • 数据结构:详解【顺序表】的实现
    1.顺序表的定义顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。动态顺序表与数组的本质区别是——根据需要动态的开辟空间大小。2.顺序表的功能动态顺序表的功能一般有如下几个:初始化顺序表打印顺序表中的数据检查顺序表的......
  • 运算符及优先级
    &和&&:两边有一边是false,则结果就是false。(短路)|和||:左边是true时,右边不参与运算。只要有一边是true,则结果是true。^:当两边都为true时,则为false。*&运算时,都是1结果才为1,其他情况都是0。|运算时,都是0结果为0,其他情况都是1。^运算时,都是0或者1时结果为1,其他情况都是1。~运算时,......
  • 【数据结构初阶 9】内排序
    文章目录......
  • 数据结构与算法学习(01)交换函数的指针陷阱
    先看以下正确的例子 voidswap(int*px,int*py){inttemp;temp=*px;/*间接取*/*px=*py; /*间接取,间接存*/*py=temp; /*间接存*/}int main(void){inta=2,b=3;swap(&a,&b);printf("a=%d,b=%d",a,b);return......
  • 数据结构算法系列----背包问题(01,完全,多重)
    一、01背包1、01背包介绍    "01背包"是一个经典的动态规划问题。在01背包中,给定一个背包容量和一组物品,每个物品都有自己的重量和价值。问题的目标是选择一些物品放入背包中,使得放入的物品总重量不超过背包容量,同时使得放入的物品总价值最大。    "01"表......
  • 数据结构算法系列----快速幂
    一、快速幂的介绍:1、为什么要使用快速幂:   当我们计算a的n次幂时,最先想到的肯定是c中的内置函数  pow(a,n),这个内置函数虽然简单方便,但是在实际使用中这个函数的时间复杂度是o(n),因为它是将a乘n次得到的答案。  由于在n非常大时用pow()很容易超时,因此我们引入一个时......
  • C#集合和数据结构,随笔记录
    C#集合和数据结构System.Collections命名空间包含接口和类,这些接口和类定义各种对象(如列表/链表、位数组、哈希表、队列和堆栈)的集合            System.Collections.Generic命名空间:所有集合都直接或间接基于ICollection接口列表类集合类型:集合类型基......
  • 【数据结构】五分钟自测主干知识(七)
    最近略忙,今天为大家献上数组一节的拓展知识,我们可以从中加深对数组存储对理解,同时温习数组降低存储量的方法,我们会以矩阵存储为典例。主干知识,可以对照黑体字来进行自测~数组基本概念一维数组是纯粹的线性表,数组的元素类型就是线性表的元素类型;二维数组则可以看成“元素......
  • 二维树状数组
    二维树状数组模板单点修改,子矩阵查询暴力的把一维拓展到二维,直接然后按照一维的方法搞就OK,参考代码:voidinsert(intx,inty,intz){for(inti=x;i<=n;i+=lowbit(i))for(intj=y;j<=m;j+=lowbit(j))d[i][j]+=z;}intgetsum(intx,inty){intsum=0;for(......
  • C语言数据结构实现酒店管理
    #include<stdio.h>#include<windows.h>#include<stdlib.h> #include<string.h>//用于用户验证 #defineMAX100//最大房间容量 #defineStytm20#definemAX1024//文件读取字符长 intfileHang(FILE*fp);intlength=0;//房间顺序 typedefintDataType;typ......