package contests.contest25;
import problems.utils.TreeNode;
import java.util.*;
/**
* Created by sherxon on 3/25/17.
*/
public class BoundaryofBinaryTree {
public static void main(String[] args) {
}
public List<Integer> boundaryOfBinaryTree(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) return list;
list.add(root.val);
if (root.left == null && root.right == null) return list;
Set<TreeNode> set = new HashSet<>();
LinkedList<TreeNode> leftView = new LinkedList<>();
goLeft(root.left, leftView, 0);
Iterator<TreeNode> itleft = leftView.iterator();
while (itleft.hasNext()) {
TreeNode cur = itleft.next();
if (!set.contains(cur)) {
set.add(cur);
list.add(cur.val);
}
}
getLeaves(root, list, set);
LinkedList<TreeNode> rightView = new LinkedList<>();
goRight(root.right, rightView, 0);
Iterator<TreeNode> itright = rightView.iterator();
while (itright.hasNext()) {
TreeNode cur = itright.next();
if (!set.contains(cur)) {
set.add(cur);
list.add(cur.val);
}
}
return list;
}
private void goRight(TreeNode root, LinkedList<TreeNode> list, int level) {
if (root == null) return;
if (list.size() == level) list.addFirst(root);
goRight(root.right, list, level + 1);
goRight(root.left, list, level + 1);
}
private void getLeaves(TreeNode root, List<Integer> list, Set<TreeNode> set) {
if (root == null) return;
if (root.left == null && root.right == null && !set.contains(root)) {
list.add(root.val);
set.add(root);
}
getLeaves(root.left, list, set);
getLeaves(root.right, list, set);
}
private void goLeft(TreeNode root, LinkedList<TreeNode> list, int level) {
if (root == null) return;
if (level == list.size()) list.add(root);
goLeft(root.left, list, level + 1);
goLeft(root.right, list, level + 1);
}
}