import java.util.*; class SameFringe { public interface Node> { Node getLeft(); Node getRight(); boolean isLeaf(); T getData(); } public static class SimpleNode> implements Node { private final T data; public SimpleNode left; public SimpleNode right; public SimpleNode(T data) { this(data, null, null); } public SimpleNode(T data, SimpleNode left, SimpleNode right) { this.data = data; this.left = left; this.right = right; } public Node getLeft() { return left; } public Node getRight() { return right; } public boolean isLeaf() { return ((left == null) && (right == null)); } public T getData() { return data; } public SimpleNode addToTree(T data) { int cmp = data.compareTo(this.data); if (cmp == 0) throw new IllegalArgumentException("Same data!"); if (cmp < 0) { if (left == null) return (left = new SimpleNode(data)); return left.addToTree(data); } if (right == null) return (right = new SimpleNode(data)); return right.addToTree(data); } } public static > boolean areLeavesSame(Node node1, Node node2) { Stack> stack1 = new Stack>(); Stack> stack2 = new Stack>(); stack1.push(node1); stack2.push(node2); // NOT using short-circuit operator while (((node1 = advanceToLeaf(stack1)) != null) & ((node2 = advanceToLeaf(stack2)) != null)) if (!node1.getData().equals(node2.getData())) return false; // Return true if finished at same time return (node1 == null) && (node2 == null); } private static > Node advanceToLeaf(Stack> stack) { while (!stack.isEmpty()) { Node node = stack.pop(); if (node.isLeaf()) return node; Node rightNode = node.getRight(); if (rightNode != null) stack.push(rightNode); Node leftNode = node.getLeft(); if (leftNode != null) stack.push(leftNode); } return null; } public static void main(String[] args) { SimpleNode headNode1 = new SimpleNode(35, new SimpleNode(25, new SimpleNode(15, new SimpleNode(10), new SimpleNode(20)), new SimpleNode(30)), new SimpleNode(45, new SimpleNode(40), new SimpleNode(50))); SimpleNode headNode2 = new SimpleNode(24, new SimpleNode(14, new SimpleNode(10), new SimpleNode(16, null, new SimpleNode(20))), new SimpleNode(34, new SimpleNode(30), new SimpleNode(42, new SimpleNode(40), new SimpleNode(56, new SimpleNode(50), null)))); SimpleNode headNode3 = new SimpleNode(24, new SimpleNode(14, new SimpleNode(10), new SimpleNode(16, null, new SimpleNode(20))), new SimpleNode(34, new SimpleNode(30), new SimpleNode(42, new SimpleNode(40), new SimpleNode(50, null, new SimpleNode(56))))); System.out.print("Leaves for set 1: "); simpleWalk(headNode1); System.out.println(); System.out.print("Leaves for set 2: "); simpleWalk(headNode2); System.out.println(); System.out.print("Leaves for set 3: "); simpleWalk(headNode3); System.out.println(); System.out.println("areLeavesSame(1, 2)? " + areLeavesSame(headNode1, headNode2)); System.out.println("areLeavesSame(2, 3)? " + areLeavesSame(headNode2, headNode3)); } public static void simpleWalk(Node node) { if (node.isLeaf()) System.out.print(node.getData() + " "); else { Node left = node.getLeft(); if (left != null) simpleWalk(left); Node right = node.getRight(); if (right != null) simpleWalk(right); } } }