Vertical sums of a binary tree are the sum of its each vertical column. For e.g. consider the below tree,
5
/ \
3 8
/ \ / \
2 4 6 9
Vertical Sum for first column: 2
Vertical Sum for second column: 3
Vertical Sum for third column: 15 (5+4+6)
Vertical Sum for fourth column: 8
Vertical Sum for fifth column: 9
Output: 2 3 15 8 9
Algorithm:
- start from root and hash its value in a map using a key, say, 'key_col'
- recursively hash left and right children with key value 'key_col-1' and 'key_col+1'
- if the key entry is not present in the hash map then create one and set value as 'root->data'
- if the key entry is already present then just add 'root->data' to the existing value
In the end, we have vertical sum stored in the hash map. Here is the code,
5
/ \
3 8
/ \ / \
2 4 6 9
Vertical Sum for first column: 2
Vertical Sum for second column: 3
Vertical Sum for third column: 15 (5+4+6)
Vertical Sum for fourth column: 8
Vertical Sum for fifth column: 9
Output: 2 3 15 8 9
Algorithm:
- start from root and hash its value in a map using a key, say, 'key_col'
- recursively hash left and right children with key value 'key_col-1' and 'key_col+1'
- if the key entry is not present in the hash map then create one and set value as 'root->data'
- if the key entry is already present then just add 'root->data' to the existing value
In the end, we have vertical sum stored in the hash map. Here is the code,
void mapNode(struct node* root, map& m, int col)
{
if(root == NULL)
return;
map::iterator it = m.find(col);
//if column is already mapped and map already
//has some value stored for the column then
//add root->data to already stored value, otherwise,
//just store root->data.
if(it == m.end())
m.insert(pair(col, root->data));
else
it->second += root->data;
mapNode(root->left, m, col-1);
mapNode(root->right, m, col+1);
}
int main()
{
struct node *root=NULL;
map m;
map::iterator iter;
insert(&root, 50);
insert(&root, 25);
insert(&root, 100);
insert(&root, 30);
insert(&root, 20);
insert(&root, 75);
mapNode(root, m, 0);
for(iter = m.begin(); iter != m.end(); iter++)
printf("%d ", iter->second);
printf("\n");
return 0;
}
No comments:
Post a Comment