# Find the root of the sub-tree whose weighted sum XOR with X is minimum

Given a tree, and the weights of all the nodes, the task is to find the root of the sub-tree whose weighted sum XOR with given integer **X** is minimum.

**Examples:**

Input:

X = 15

Output:5

Weight of sub-tree for parent 1 = ((-1) + (5) + (-2) + (-1) + (3)) XOR 15 = 4 XOR 15 = 11

Weight of sub-tree for parent 2 = ((5) + (-1) + (3)) XOR 15 = 7 XOR 15 = 8

Weight of sub-tree for parent 3 = -1 XOR 15 = -16

Weight of sub-tree for parent 4 = 3 XOR 15 = 12

Weight of sub-tree for parent 5 = -2 XOR 15 = -15

Node 3 gives the minimum sub-tree weighted sum XOR X.

**Approach:** Perform dfs on the tree, and for every node calculate the sub-tree weighted sum rooted at the current node then find the minimum (sum XOR X) value for a node.

Below is the implementation of the above approach:

`// C++ implementation of the approach ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `int` `ans = 0, mini = INT_MAX; ` ` ` `vector<` `int` `> graph[100]; ` `vector<` `int` `> weight(100); ` ` ` `// Function to perform dfs and update the tree ` `// such that every node's weight is the sum of ` `// the weights of all the nodes in the sub-tree ` `// of the current node including itself ` `void` `dfs(` `int` `node, ` `int` `parent) ` `{ ` ` ` `for` `(` `int` `to : graph[node]) { ` ` ` `if` `(to == parent) ` ` ` `continue` `; ` ` ` `dfs(to, node); ` ` ` ` ` `// Calculating the weighted ` ` ` `// sum of the subtree ` ` ` `weight[node] += weight[to]; ` ` ` `} ` `} ` ` ` `// Function to find the node ` `// having minimum sub-tree sum XOR x ` `void` `findMinX(` `int` `n, ` `int` `x) ` `{ ` ` ` ` ` `// For every node ` ` ` `for` `(` `int` `i = 1; i <= n; i++) { ` ` ` ` ` `// If current node's weight XOR x ` ` ` `// is minimum so far ` ` ` `if` `(mini > (weight[i] ^ x)) { ` ` ` `mini = (weight[i] ^ x); ` ` ` `ans = i; ` ` ` `} ` ` ` `} ` `} ` ` ` `// Driver code ` `int` `main() ` `{ ` ` ` `int` `x = 15; ` ` ` `int` `n = 5; ` ` ` ` ` `// Weights of the node ` ` ` `weight[1] = -1; ` ` ` `weight[2] = 5; ` ` ` `weight[3] = -1; ` ` ` `weight[4] = 3; ` ` ` `weight[5] = -2; ` ` ` ` ` `// Edges of the tree ` ` ` `graph[1].push_back(2); ` ` ` `graph[2].push_back(3); ` ` ` `graph[2].push_back(4); ` ` ` `graph[1].push_back(5); ` ` ` ` ` `dfs(1, 1); ` ` ` `findMinX(n, x); ` ` ` ` ` `cout << ans; ` ` ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

**Output:**

3

## Recommended Posts:

- Find the root of the sub-tree whose weighted sum is minimum
- Find the root of the sub-tree whose weighted sum XOR with X is maximum
- Check if two nodes are in same subtree of the root node
- Find if there is a pair in root to a leaf path with sum equals to root's data
- Minimum distance to visit all the nodes of an undirected weighted tree
- Minimum cost to connect weighted nodes represented as array
- Find largest subtree sum in a tree
- Find the Kth node in the DFS traversal of a given subtree in a Tree
- Find the largest BST subtree in a given Binary Tree | Set 1
- Find largest subtree having identical left and right subtrees
- Find the largest Complete Subtree in a given Binary Tree
- Find the largest Perfect Subtree in a given Binary Tree
- Minimum edge reversals to make a root
- Find root of the tree where children id sum for every node is given
- Find Nth positive number whose digital root is X

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.