
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Find Special Nodes in a Tree Using Python
Suppose we have a 2D list of values called 'tree' which represents an n-ary tree and another list of values called 'color'. The tree is represented as an adjacency list and its root is tree[0].
The characteristics of an i-th node −
tree[i] is its children and parent.
color[i] is its color.
We call a node N "special" if every node in the subtree whose root is at N has a unique color. So we have this tree, we have to find out the number of special nodes.
So, if the input is like tree = [ [1,2], [0], [0,3], [2] ]
colors = [1, 2, 1, 1], then the output will be 2.
To solve this, we will follow these steps −
result := 0
dfs(0, -1)
return result
-
Define a function check_intersection() . This will take colors, child_colors
-
if length of (colors) < length of (child_colors) , then
-
for each c in colors, do
-
if c in child_colors is non-zero, then
return True
-
-
-
otherwise,
-
for each c in child_colors, do
-
if c is present in child_colors, then
return True
-
-
-
-
Define a function dfs() . This will take node, prev
colors := {color[node]}
-
for each child in tree[node], do
-
if child is not same as prev, then
child_colors := dfs(child, node)
-
if colors and child_colors are not empty, then
-
if check_intersection(colors, child_colors) is non-zero, then
colors := null
-
otherwise,
-
if length of (colors) < length of (child_colors),then,
child_colors := child_colors OR colors
colors := child_colors
-
otherwise,
colors := colors OR child_colors
-
-
-
otherwise,
colors := null
-
if colors is not empty, then
result := result + 1
return colors
-
Example
Let us see the following implementation to get better understanding −
import collections class Solution: def solve(self, tree, color): self.result = 0 def dfs(node, prev): colors = {color[node]} for child in tree[node]: if child != prev: child_colors = dfs(child, node) if colors and child_colors: if self.check_intersection(colors, child_colors): colors = None else: if len(colors) < len(child_colors): child_colors |= colors colors = child_colors else: colors |= child_colors else: colors = None if colors: self.result += 1 return colors dfs(0, -1) return self.result def check_intersection(self, colors, child_colors): if len(colors) < len(child_colors): for c in colors: if c in child_colors: return True else: for c in child_colors: if c in colors: return True ob = Solution() print(ob.solve( [ [1,2], [0], [0,3], [2] ], [1, 2, 1, 1]))
Input
[ [1,2], [0], [0,3], [2] ], [1, 2, 1, 1]
Output
2