Boundary Traversal of binary tree
void print_exterior_boundary(TreeNode *r) {
if(!r) return;
print_left_boundary_topdown(r);
print_leaves(r);
print_right_boundary_bottomup(r);
}
// print all leaves in left-right manner
void print_leaves(TreeNode *r) {
if(!r) return;
print_leaves(r->left);
if(!r->left && !r->right) cout << r->val << " ";
print_leaves(r->right);
}
// print all left boundry nodes, except a leaf node, in top-down manner
void print_left_boundary_topdown(TreeNode *r) {
if(!r) return;
if(r->left) {
cout << r->val << " ";
print_left_boundary_topdown(r->left);
}
else if(r->right) { // gist1
cout << r->val << " ";
print_left_boundary_topdown(r->right);
}
// do nothing if it is a leaf node, this way we avoid duplicates in output
}
void print_right_boundary_bottomup(TreeNode *r) {
if(!r) return;
if(r->right) {
print_right_boundary_bottomup(r->right);
cout << r->val << " ";
}
else if(r->left) { // gist2
print_right_boundary_bottomup(r->left);
cout << r->val << " ";
}
// do nothing if it is a leaf node, this way we avoid duplicates in output
}