树的前向星存储 以及BFS和DFS遍历

本文介绍了树的前向星存储方法,详细解析了变量cnt、head[x]数组、e[max*2]数组和vis[x]数组在存储和遍历树过程中的作用。同时,提供了建树以及使用深度优先搜索(DFS)和广度优先搜索(BFS)遍历树的实现,并重点讨论了head数组在建树过程中的关键功能。作为作者的首篇博客,虽然风格严肃,但深入浅出地探讨了树结构的基础知识。

代码中用到的变量及数组的作用解析:
1. 变量cnt:用于迭代存入所有的边
2. head[x]数组:head[x]表示的是x最后读入的出边的编号(x为树的一个节点)
3. e[max*2]数组:表示树中所有边(例如e[0]表示第0号边)
4. vis[x]数组:记录该节点是否遍历过,若已遍历,则不考虑

                                                            建树以及dfs遍历

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=2e5+10;

struct edge
{
    int to;
    int next;
}e[maxn<<1];

int n;
int cnt=-1;
int head[maxn];
bool vis[maxn];

void init()
{
	//memset(e,0,sizeof(e));
    memset(head,-1,sizeof(head));
    memset(vis,false,sizeof(vis));
    cnt=-1;
}
void add_edge(int u,int v)
{
    e[++cnt].to=v;
    e[cnt].next=head[u];
    head[u]=cnt;
}

void dfs(int x)
{
    if(!vis[x])
    {
        cout<<x<<" ";
        vis[x]=1;
        for(in
### 链式向星遍历的实现方法与数据结构 链式向星是一种高效的存储稀疏矩阵的方法,在图论中常用于表示邻接表形式的图。它通过数组模拟链表的方式,能够快速访问边的信息并支持高效的操作。 #### 数据结构设计 链式向星的核心在于利用两个数组来构建邻接表: - **`head[]`**: 记录每个节点的第一条边的位置索引。 - **`edge[]`**: 存储每条边的目标节点编号以及下一条边的指针位置。 具体定义如下: ```c++ struct Edge { int to; // 边指向的节点 int next; // 下一条边的索引 }; Edge edges[MAXM]; // 边集数组,MAXM为最大可能的边数 int head[MAXN], tot = 0; // MAXN为最大可能的节点数, tot记录当边的数量 ``` 当新增加一条从 `u` 到 `v` 的边时,可以按照以下方式更新数组[^1]: ```c++ void add_edge(int u, int v) { edges[tot].to = v; edges[tot].next = head[u]; head[u] = tot++; } ``` 此操作的时间复杂度接近 O(1),因此非常适合大规模图的数据处理场景。 #### 图的非递归深度优先遍历 (DFS) 对于基于链式向星存储的图,可以通过栈或者显式的循环控制来进行非递归版本的 DFS 。以下是具体的实现代码: ```cpp #include <iostream> #include <vector> using namespace std; const int MAXN = 1e5 + 7; const int MAXM = 2e5 + 7; // 定义边结构体 struct Edge { int to; int next; } edges[MAXM]; int head[MAXN], tot = 0; // 添加边函数 void add_edge(int u, int v){ edges[tot].to = v; edges[tot].next = head[u]; head[u] = tot++; } bool vis[MAXN]; // 是否访问过标记数组 // 非递归DFS核心逻辑 void dfs_non_recursive(int start_node){ vector<int> stack; stack.push_back(start_node); while(!stack.empty()){ int current = stack.back(); stack.pop_back(); if (!vis[current]){ cout << current << ' '; vis[current] = true; for(int i=head[current];i!=-1;i=edges[i].next){ int neighbor = edges[i].to; if(!vis[neighbor]) stack.push_back(neighbor); } } } } ``` 上述代码展示了如何使用标准库中的容器完成一次完整的非递归深度优先搜索过程。 #### 图的非递归广度优先遍历 (BFS) 同样地,也可以采用队列代替栈的方式来执行 BFS : ```cpp queue<int> q; q.push(start_node); while(!q.empty()) { int node = q.front(); q.pop(); if(vis[node]) continue; vis[node]=true; printf("%d ",node); for(int e=head[node];~e;e=edges[e].next){ int adjNode = edges[e].to; if(!vis[adjNode]) q.push(adjNode); } } ``` 这段程序实现了基础版的广度优先扫描功能. #### 总结 以上介绍了链式向星作为底层支撑技术下的两种主要图遍历策略——DFS BFS ,它们均具备较高的性能表现,并且易于扩展到更复杂的实际应用场景之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值