#include <bits/stdc++.h>
using
namespace
std;
struct
Node {
int
data;
struct
Node* left;
struct
Node* right;
};
Node* newNode(
int
data)
{
Node* temp =
new
Node;
temp->left = NULL;
temp->right = NULL;
temp->data = data;
return
temp;
}
void
LeftBoundary(Node* root,
int
& sum_of_boundary_nodes)
{
if
(root) {
if
(root->left) {
sum_of_boundary_nodes += root->data;
LeftBoundary(root->left, sum_of_boundary_nodes);
}
else
if
(root->right) {
sum_of_boundary_nodes += root->data;
LeftBoundary(root->right, sum_of_boundary_nodes);
}
}
}
void
RightBoundary(Node* root,
int
& sum_of_boundary_nodes)
{
if
(root) {
if
(root->right) {
RightBoundary(root->right, sum_of_boundary_nodes);
sum_of_boundary_nodes += root->data;
}
else
if
(root->left) {
RightBoundary(root->left, sum_of_boundary_nodes);
sum_of_boundary_nodes += root->data;
}
}
}
void
Leaves(Node* root,
int
& sum_of_boundary_nodes)
{
if
(root) {
Leaves(root->left, sum_of_boundary_nodes);
if
(!(root->left) && !(root->right))
sum_of_boundary_nodes += root->data;
Leaves(root->right, sum_of_boundary_nodes);
}
}
int
sumOfBoundaryNodes(
struct
Node* root)
{
if
(root) {
int
sum_of_boundary_nodes = root->data;
LeftBoundary(root->left, sum_of_boundary_nodes);
Leaves(root->left, sum_of_boundary_nodes);
Leaves(root->right, sum_of_boundary_nodes);
RightBoundary(root->right, sum_of_boundary_nodes);
return
sum_of_boundary_nodes;
}
return
0;
}
int
main()
{
Node* root = newNode(10);
root->left = newNode(2);
root->right = newNode(5);
root->left->left = newNode(8);
root->left->right = newNode(14);
root->right->left = newNode(11);
root->right->right = newNode(3);
root->left->right->left = newNode(12);
root->right->left->right = newNode(1);
root->right->left->left = newNode(7);
cout << sumOfBoundaryNodes(root);
return
0;
}