Solution: average time O(h) worst case is O(n)
Find seperately.
class Solution {
List<Integer> res = new ArrayList<>();
public List<Integer> boundaryOfBinaryTree(TreeNode root) {
if (root == null) {
return res;
}
res.add(root.val);
findLeftBoundary(root.left);
findLeaf(root.left);
findLeaf(root.right);
findRightBoundary(root.right);
return res;
}
public void findLeaf(TreeNode node) {
if (node == null) {
return;
}
// node is leaf node
if (node.left == null && node.right == null) {
res.add(node.val);
return;
}
findLeaf(node.left);
findLeaf(node.right);
}
public void findLeftBoundary(TreeNode node) {
if (node == null || (node.left == null && node.right == null)) {
return; // skip leaf
}
res.add(node.val);
if (node.left != null) {
findLeftBoundary(node.left);
} else {
findLeftBoundary(node.right);
}
}
public void findRightBoundary(TreeNode node) {
if (node == null || (node.left == null && node.right == null)) {
return; // skip leaf
}
if (node.right != null) {
findRightBoundary(node.right);
} else {
findRightBoundary(node.left);
}
res.add(node.val); // add reverse, after visiting child
}
}