查找给定每个节点的子 ID 总和的树的根
考虑一棵二叉树,其节点的 id 从 1 到 n,其中 n 是树中的节点数。树是作为 n 对的集合给出的,其中每一对代表节点 ID 和子 ID 的总和。
例子:
Input : 1 5
2 0
3 0
4 0
5 5
6 5
Output: 6
Explanation: In this case, two trees can
be made as follows and 6 is the root node.
6 6
\ / \
5 1 4
/ \ \
1 4 5
/ \ / \
2 3 2 3
Input : 4 0
Output: 4
Explanation: Clearly 4 does
not have any children and is the
only node i.e., the root node.
乍一看,这个问题似乎是一个典型的树数据结构问题,但它
可以如下解决。
每个节点 id 都出现在除根之外的子总和中。因此,如果我们对所有 id 进行求和,然后从所有子项的总和中减去它,我们就得到了 root。
C++
// Find root of tree where children
// sum for every node id is given.
#include
using namespace std;
int findRoot(pair arr[], int n)
{
// Every node appears once as an id, and
// every node except for the root appears
// once in a sum. So if we subtract all
// the sums from all the ids, we're left
// with the root id.
int root = 0;
for (int i=0; i arr[] = {{1, 5}, {2, 0},
{3, 0}, {4, 0}, {5, 5}, {6, 5}};
int n = sizeof(arr)/sizeof(arr[0]);
printf("%d\n", findRoot(arr, n));
return 0;
}
Java
// Find root of tree where children
// sum for every node id is given.
class GFG
{
static class pair
{
int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
static int findRoot(pair arr[], int n)
{
// Every node appears once as an id, and
// every node except for the root appears
// once in a sum. So if we subtract all
// the sums from all the ids, we're left
// with the root id.
int root = 0;
for (int i = 0; i < n; i++)
{
root += (arr[i].first - arr[i].second);
}
return root;
}
// Driver code
public static void main(String[] args)
{
pair arr[] = {new pair(1, 5), new pair(2, 0),
new pair(3, 0), new pair(4, 0),
new pair(5, 5), new pair(6, 5)};
int n = arr.length;
System.out.printf("%d\n", findRoot(arr, n));
}
}
/* This code is contributed by PrinciRaj1992 */
Python3
"""Find root of tree where children
sum for every node id is given"""
def findRoot(arr, n) :
# Every node appears once as an id, and
# every node except for the root appears
# once in a sum. So if we subtract all
# the sums from all the ids, we're left
# with the root id.
root = 0
for i in range(n):
root += (arr[i][0] - arr[i][1])
return root
# Driver Code
if __name__ == '__main__':
arr = [[1, 5], [2, 0],
[3, 0], [4, 0],
[5, 5], [6, 5]]
n = len(arr)
print(findRoot(arr, n))
# This code is contributed
# by SHUBHAMSINGH10
C#
// C# Find root of tree where children
// sum for every node id is given.
using System;
class GFG
{
public class pair
{
public int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
static int findRoot(pair []arr, int n)
{
// Every node appears once as an id, and
// every node except for the root appears
// once in a sum. So if we subtract all
// the sums from all the ids, we're left
// with the root id.
int root = 0;
for (int i = 0; i < n; i++)
{
root += (arr[i].first - arr[i].second);
}
return root;
}
// Driver code
public static void Main(String[] args)
{
pair []arr = {new pair(1, 5), new pair(2, 0),
new pair(3, 0), new pair(4, 0),
new pair(5, 5), new pair(6, 5)};
int n = arr.Length;
Console.Write("{0}\n", findRoot(arr, n));
}
}
/* This code is contributed by PrinciRaj1992 */
Javascript
输出:
6