📜  欧拉树之旅

📅  最后修改于: 2022-05-13 01:57:19.750000             🧑  作者: Mango

欧拉树之旅

树是连通图的概括,其中它有 N 个节点,这些节点恰好有 N-1 条边,即每对顶点之间有一条边。求邻接表表示的树的欧拉之旅。
例子:
输入 :

输出:1 2 3 2 4 2 1
输入 :

输出:1 5 4 2 4 3 4 5 1

欧拉之旅被定义为一种遍历树的方式,这样当我们访问它时,每个顶点都被添加到之旅中(从父顶点向下移动或从子顶点返回)。我们从根开始,在访问完所有顶点后回到根。
它需要恰好 2*N-1 个顶点来存储欧拉环。

方法:我们将在树上运行 DFS(深度优先搜索)算法:

(1)访问根节点,即1
可见[1]=1,欧拉[0]=1
为所有未访问的相邻节点运行 dfs()(2)
(2)访问节点2
可见[2]=1,欧拉[1]=2
为所有未访问的相邻节点运行 dfs() (3, 4)
(3)访问节点3
可见[3]=1,欧拉[2]=3
所有相邻节点都已经访问过,返回父节点
并将父级添加到 Euler tour Euler[3]=2
(4)访问节点4
可见[4]=1,欧拉[4]=4
所有相邻节点都已经访问过,返回父节点
并将父级添加到 Euler 巡回赛,Euler[5]=2
(5)访问节点2
所有相邻节点都已经访问过,返回父节点
并将父级添加到 Euler 游览中,Euler[6]=1
(6)访问节点1
所有相邻节点都已经访问过,节点1是根节点
所以,我们在这里停止递归。
同样,例如2:

C++
// C++ program to print Euler tour of a
// tree.
#include 
using namespace std;
 
#define MAX 1001
 
// Adjacency list representation of tree
vector adj[MAX];
 
// Visited array to keep track visited
// nodes on tour
int vis[MAX];
 
// Array to store Euler Tour
int Euler[2 * MAX];
 
// Function to add edges to tree
void add_edge(int u, int v)
{
    adj[u].push_back(v);
    adj[v].push_back(u);
}
 
// Function to store Euler Tour of tree
void eulerTree(int u, int &index)
{
    vis[u] = 1;
    Euler[index++] = u;
    for (auto it : adj[u]) {
        if (!vis[it]) {
            eulerTree(it, index);
            Euler[index++] = u;
        }
    }
}
 
// Function to print Euler Tour of tree
void printEulerTour(int root, int N)
{
    int index = 0; 
    eulerTree(root, index);
    for (int i = 0; i < (2*N-1); i++)
        cout << Euler[i] << " ";
}
 
// Driver code
int main()
{
    int N = 4;
 
    add_edge(1, 2);
    add_edge(2, 3);
    add_edge(2, 4);
 
    // Consider 1 as root and print
    // Euler tour
    printEulerTour(1, N);
 
    return 0;
}


Java
// Java program to print Euler tour of a
// tree.
import java.util.*;
 
class GFG{
 
static final int MAX = 1001;
static int index = 0;
 
// Adjacency list representation of tree
static ArrayList<
       ArrayList> adj = new ArrayList<>();
 
// Visited array to keep track visited
// nodes on tour
static int vis[] = new int[MAX];
 
// Array to store Euler Tour
static int Euler[] = new int[2 * MAX];
 
// Function to add edges to tree
static void add_edge(int u, int v)
{
    adj.get(u).add(v);
    adj.get(v).add(u);
}
 
// Function to store Euler Tour of tree
static void eulerTree(int u)
{
    vis[u] = 1;
    Euler[index++] = u;
     
    for(int it : adj.get(u))
    {
        if (vis[it] == 0)
        {
            eulerTree(it);
            Euler[index++] = u;
        }
    }
}
 
// Function to print Euler Tour of tree
static void printEulerTour(int root, int N)
{
    eulerTree(root);
    for(int i = 0; i < (2 * N - 1); i++)
        System.out.print(Euler[i] + " ");
}
 
// Driver code
public static void main(String[] args)
{
    int N = 4;
     
    for(int i = 0; i <= N; i++)
        adj.add(new ArrayList<>());
         
    add_edge(1, 2);
    add_edge(2, 3);
    add_edge(2, 4);
 
    // Consider 1 as root and print
    // Euler tour
    printEulerTour(1, N);
}
}
 
// This code is contributed by jrishabh99


Javascript


输出:
1 2 3 2 4 2 1

辅助空间:O(N)
时间复杂度:O(N)