We use cookies to ensure you have the best browsing experience on our website. Please read our cookie policy for more information about how we use cookies.
abstract class Tree {
private int value;
private Color color;
private int depth;
public Tree(int value, Color color, int depth) {
this.value = value;
this.color = color;
this.depth = depth;
}
public int getValue() {
return value;
}
public Color getColor() {
return color;
}
public int getDepth() {
return depth;
}
public abstract void accept(TreeVis visitor);
}
class TreeNode extends Tree {
private List children = new ArrayList<>();
public TreeNode(int value, Color color, int depth) {
super(value, color, depth);
}
public void accept(TreeVis visitor) {
visitor.visitNode(this);
for (Tree child : children) {
child.accept(visitor);
}
}
public void addChild(Tree child) {
children.add(child);
}
}
class TreeLeaf extends Tree {
public TreeLeaf(int value, Color color, int depth) {
super(value, color, depth);
}
public void accept(TreeVis visitor) {
visitor.visitLeaf(this);
}
}
abstract class TreeVis {
public abstract int getResult();
public abstract void visitNode(TreeNode node);
public abstract void visitLeaf(TreeLeaf leaf);
}
class SumInLeavesVisitor extends TreeVis {
private int sum = 0;
public int getResult() {
return sum;
}
public void visitNode(TreeNode node) {
// Do nothing
}
public void visitLeaf(TreeLeaf leaf) {
sum += leaf.getValue();
}
}
class ProductRedNodesVisitor extends TreeVis {
private long product = 1;
private final int MOD = 1000000007;
public int getResult() {
return (int) product;
}
public void visitNode(TreeNode node) {
if (node.getColor() == Color.RED) {
product = (product * node.getValue()) % MOD;
}
}
public void visitLeaf(TreeLeaf leaf) {
if (leaf.getColor() == Color.RED) {
product = (product * leaf.getValue()) % MOD;
}
}
}
class FancyVisitor extends TreeVis {
private int evenDepthNonLeafSum = 0;
private int greenLeafSum = 0;
public int getResult() {
return Math.abs(evenDepthNonLeafSum - greenLeafSum);
}
public void visitNode(TreeNode node) {
if (node.getDepth() % 2 == 0) {
evenDepthNonLeafSum += node.getValue();
}
}
public void visitLeaf(TreeLeaf leaf) {
if (leaf.getColor() == Color.GREEN) {
greenLeafSum += leaf.getValue();
}
}
}
public class Solution {
public static Tree solve() {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] values = new int[n];
byte[] colors = new byte[n];
for (int i = 0; i < n; i++) {
values[i] = scan.nextInt();
}
for (int i = 0; i < n; i++) {
colors[i] = scan.nextByte();
}
Map<Integer, List<Integer>> adj = new HashMap<>();
for (int i = 0; i < n; i++) {
adj.put(i, new ArrayList<>());
}
for (int i = 0; i < n - 1; i++) {
int u = scan.nextInt() - 1;
int v = scan.nextInt() - 1;
adj.get(u).add(v);
adj.get(v).add(u);
}
scan.close();
boolean[] visited = new boolean[n];
return buildTree(0, 0, values, colors, adj, visited);
}
public static Tree buildTree(int index, int depth, int[] values, byte[] colors, Map<Integer, List<Integer>> adj, boolean[] visited) {
visited[index] = true;
Color color = colors[index] == 0 ? Color.RED : Color.GREEN;
List<Integer> children = adj.get(index);
boolean isLeaf = true;
List<Tree> childTrees = new ArrayList<>();
for (int child : children) {
if (!visited[child]) {
isLeaf = false;
childTrees.add(buildTree(child, depth + 1, values, colors, adj, visited));
}
}
if (isLeaf) {
return new TreeLeaf(values[index], color, depth);
} else {
TreeNode node = new TreeNode(values[index], color, depth);
for (Tree child : childTrees) {
node.addChild(child);
}
return node;
}
}
public static void main(String[] args) {
Tree root = solve();
SumInLeavesVisitor vis1 = new SumInLeavesVisitor();
ProductRedNodesVisitor vis2 = new ProductRedNodesVisitor();
FancyVisitor vis3 = new FancyVisitor();
root.accept(vis1);
root.accept(vis2);
root.accept(vis3);
System.out.println(vis1.getResult());
System.out.println(vis2.getResult());
System.out.println(vis3.getResult());
}
}
Cookie support is required to access HackerRank
Seems like cookies are disabled on this browser, please enable them to open this website
Java Visitor Pattern
You are viewing a single comment's thread. Return to all comments →
java8 working f9- import java.util.*;
enum Color { RED, GREEN }
abstract class Tree { private int value; private Color color; private int depth;
}
class TreeNode extends Tree { private List children = new ArrayList<>();
}
class TreeLeaf extends Tree { public TreeLeaf(int value, Color color, int depth) { super(value, color, depth); }
}
abstract class TreeVis { public abstract int getResult(); public abstract void visitNode(TreeNode node); public abstract void visitLeaf(TreeLeaf leaf); }
class SumInLeavesVisitor extends TreeVis { private int sum = 0;
}
class ProductRedNodesVisitor extends TreeVis { private long product = 1; private final int MOD = 1000000007;
}
class FancyVisitor extends TreeVis { private int evenDepthNonLeafSum = 0; private int greenLeafSum = 0;
}
public class Solution { public static Tree solve() { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int[] values = new int[n]; byte[] colors = new byte[n];
}