给定一棵树,其中N个顶点的编号从0到N – 1 ,其中0是根节点。任务是针对多个查询检查节点是否为叶节点。
例子:
Input:
0
/ \
1 2
/ \
3 4
/
5
q[] = {0, 3, 4, 5}
Output:
No
Yes
No
Yes
From the graph, 2, 3 and 5 are the only leaf nodes.
方法:将所有顶点的度数存储为数组度数[] 。对于从A到B的每个边,度[A]和度[B]增加1 。现在,不是根节点且度数为1的每个节点都是叶节点,而其他所有节点都不是叶节点。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to calculate the degree of all the vertices
void init(int degree[], vector > edges, int n)
{
// Initializing degree of all the vertices as 0
for (int i = 0; i < n; i++) {
degree[i] = 0;
}
// For each edge from A to B, degree[A] and degree[B]
// are increased by 1
for (int i = 0; i < edges.size(); i++) {
degree[edges[i].first]++;
degree[edges[i].second]++;
}
}
// Function to perform the queries
void performQueries(vector > edges,
vector q, int n)
{
// To store the of degree
// of all the vertices
int degree[n];
// Calculate the degree for all the vertices
init(degree, edges, n);
// For every query
for (int i = 0; i < q.size(); i++) {
int node = q[i];
if (node == 0) {
cout << "No\n";
continue;
}
// If the current node has 1 degree
if (degree[node] == 1)
cout << "Yes\n";
else
cout << "No\n";
}
}
// Driver code
int main()
{
// Number of vertices
int n = 6;
// Edges of the tree
vector > edges = {
{ 0, 1 }, { 0, 2 }, { 1, 3 }, { 1, 4 }, { 4, 5 }
};
// Queries
vector q = { 0, 3, 4, 5 };
// Perform the queries
performQueries(edges, q, n);
return 0;
}
Java
// Java implementation of the approach
import java.util.*;
class GFG
{
static class pair
{
int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to calculate the degree
// of all the vertices
static void init(int degree[],
pair[] edges, int n)
{
// Initializing degree of
// all the vertices as 0
for (int i = 0; i < n; i++)
{
degree[i] = 0;
}
// For each edge from A to B,
// degree[A] and degree[B]
// are increased by 1
for (int i = 0; i < edges.length; i++)
{
degree[edges[i].first]++;
degree[edges[i].second]++;
}
}
// Function to perform the queries
static void performQueries(pair [] edges,
int []q, int n)
{
// To store the of degree
// of all the vertices
int []degree = new int[n];
// Calculate the degree for all the vertices
init(degree, edges, n);
// For every query
for (int i = 0; i < q.length; i++)
{
int node = q[i];
if (node == 0)
{
System.out.println("No");
continue;
}
// If the current node has 1 degree
if (degree[node] == 1)
System.out.println("Yes");
else
System.out.println("No");
}
}
// Driver code
public static void main(String[] args)
{
// Number of vertices
int n = 6;
// Edges of the tree
pair[] edges = {new pair(0, 1),
new pair(0, 2),
new pair(1, 3),
new pair(1, 4),
new pair(4, 5)};
// Queries
int []q = { 0, 3, 4, 5 };
// Perform the queries
performQueries(edges, q, n);
}
}
// This code is contributed by Rajput-Ji
Python3
# Python3 implementation of the approach
# Function to calculate the degree
# of all the vertices
def init(degree, edges, n) :
# Initializing degree of
# all the vertices as 0
for i in range(n) :
degree[i] = 0;
# For each edge from A to B,
# degree[A] and degree[B]
# are increased by 1
for i in range(len(edges)) :
degree[edges[i][0]] += 1;
degree[edges[i][1]] += 1;
# Function to perform the queries
def performQueries(edges, q, n) :
# To store the of degree
# of all the vertices
degree = [0] * n;
# Calculate the degree for all the vertices
init(degree, edges, n);
# For every query
for i in range(len(q)) :
node = q[i];
if (node == 0) :
print("No");
continue;
# If the current node has 1 degree
if (degree[node] == 1) :
print("Yes");
else :
print("No");
# Driver code
if __name__ == "__main__" :
# Number of vertices
n = 6;
# Edges of the tree
edges = [[ 0, 1 ], [ 0, 2 ],
[ 1, 3 ], [ 1, 4 ],
[ 4, 5 ]];
# Queries
q = [ 0, 3, 4, 5 ];
# Perform the queries
performQueries(edges, q, n);
# This code is contributed by AnkitRai01
C#
// C# implementation of the approach
using System;
class GFG
{
public class pair
{
public int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to calculate the degree
// of all the vertices
static void init(int []degree,
pair[] edges, int n)
{
// Initializing degree of
// all the vertices as 0
for (int i = 0; i < n; i++)
{
degree[i] = 0;
}
// For each edge from A to B,
// degree[A] and degree[B]
// are increased by 1
for (int i = 0; i < edges.Length; i++)
{
degree[edges[i].first]++;
degree[edges[i].second]++;
}
}
// Function to perform the queries
static void performQueries(pair [] edges,
int []q, int n)
{
// To store the of degree
// of all the vertices
int []degree = new int[n];
// Calculate the degree for all the vertices
init(degree, edges, n);
// For every query
for (int i = 0; i < q.Length; i++)
{
int node = q[i];
if (node == 0)
{
Console.WriteLine("No");
continue;
}
// If the current node has 1 degree
if (degree[node] == 1)
Console.WriteLine("Yes");
else
Console.WriteLine("No");
}
}
// Driver code
public static void Main(String[] args)
{
// Number of vertices
int n = 6;
// Edges of the tree
pair[] edges = {new pair(0, 1),
new pair(0, 2),
new pair(1, 3),
new pair(1, 4),
new pair(4, 5)};
// Queries
int []q = { 0, 3, 4, 5 };
// Perform the queries
performQueries(edges, q, n);
}
}
// This code is contributed by 29AjayKumar
输出:
No
Yes
No
Yes
时间复杂度: O(n)
如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。