Question 1:Count the number of vertical columns in a tree
Question 2:Find vertical sum of given binary tree.
Example:
The tree has 5 vertical lines
We need to output: 4 2 12 3 7
http://www.geeksforgeeks.org/vertical-sum-in-a-given-binary-tree/
Question 3:Print elements that are in a vertical column (per column) in a Binary tree
Code:
#include <stdio.h>
#include <stdlib.h>
#define MAX(a,b) ((a>b)?(a):(b))
#define MIN(a,b) ((a<b)?(a):(b))
struct node
{
int data;
struct node *left;
struct node *right;
};
//typedef tree node;
void insert(struct node *& root,int item){
if(root==NULL){
struct node *r= (struct node*)malloc(sizeof(struct node));
r->data=item;
r->left=NULL;
r->right=NULL;
root=r;
return;
}
if (item< root->data){
insert(root->left,item);
return;
}
else{
insert(root->right,item);
return;
}
return;
}
void totalCol(struct node* root, int col, int* minC, int* maxC)
{
if(root == NULL)
return;
totalCol(root->left, col-1, minC, maxC);
totalCol(root->right, col+1, minC, maxC);
*minC = MIN(*minC, col);
*maxC = MAX(*maxC, col);
}
int main()
{
struct node *root=NULL;
int minC=0;
int maxC=0;
insert(root, 50);
insert(root, 25);
insert(root, 100);
insert(root, 30);
insert(root, 10);
insert(root, 5);
totalCol(root, 0, &minC, &maxC);
printf("Total Col: %d\n", maxC - minC + 1);
return 0;
}
Code:
Question 2:Find vertical sum of given binary tree.
Example:
1 / \ 2 3 / \ / \ 4 5 6 7
The tree has 5 vertical lines
Vertical-1: nodes-4 => vertical sum is 4 Vertical-2: nodes-2 => vertical sum is 2 Vertical-3: nodes-1,5,6 => vertical sum is 1+5+6 = 12 Vertical-4: nodes-3 => vertical sum is 3 Vertical-5: nodes-7 => vertical sum is 7
We need to output: 4 2 12 3 7
http://www.geeksforgeeks.org/vertical-sum-in-a-given-binary-tree/
Question 3:Print elements that are in a vertical column (per column) in a Binary tree
Total Number of Columns:
Every node in a binary tree can be considered belonging to a column. If we assume that 'root' belongs to column '0' then root->left belongs to column '-1', root->right belongs to column '+1' and root->left->right belongs to column '0' and so on. We have to find the total number of such columns.Code:
#include <stdio.h>
#include <stdlib.h>
#define MAX(a,b) ((a>b)?(a):(b))
#define MIN(a,b) ((a<b)?(a):(b))
struct node
{
int data;
struct node *left;
struct node *right;
};
//typedef tree node;
void insert(struct node *& root,int item){
if(root==NULL){
struct node *r= (struct node*)malloc(sizeof(struct node));
r->data=item;
r->left=NULL;
r->right=NULL;
root=r;
return;
}
if (item< root->data){
insert(root->left,item);
return;
}
else{
insert(root->right,item);
return;
}
return;
}
void totalCol(struct node* root, int col, int* minC, int* maxC)
{
if(root == NULL)
return;
totalCol(root->left, col-1, minC, maxC);
totalCol(root->right, col+1, minC, maxC);
*minC = MIN(*minC, col);
*maxC = MAX(*maxC, col);
}
int main()
{
struct node *root=NULL;
int minC=0;
int maxC=0;
insert(root, 50);
insert(root, 25);
insert(root, 100);
insert(root, 30);
insert(root, 10);
insert(root, 5);
totalCol(root, 0, &minC, &maxC);
printf("Total Col: %d\n", maxC - minC + 1);
return 0;
}
Vertical Sum:
Code:
#include <stdio.h>
#include <stdlib.h>
#define MAX_WIDTH 100
struct node
{
int data;
struct node* left;
struct node* right;
};
int height(struct node* node)
{
if (node==NULL)
return 0;
else
{
int lheight = height(node->left);
int rheight = height(node->right);
if (lheight > rheight)
return(lheight+1);
else return(rheight+1);
}
}
void compute_vertical_sum(struct node *node, int index,int vertical_sum[])
{
if( node == NULL ) return;
vertical_sum[index] += node->data;
compute_vertical_sum( node->left, index-1,vertical_sum);
compute_vertical_sum( node->right, index+1,vertical_sum);
}
struct node* newNode(int data)
{
struct node* node = (struct node*)
malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}
int main()
{
int vertical_sum[MAX_WIDTH]= {0};
struct node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
root->left->right->left = newNode(6);
root->left->left->left = newNode(9);
int h=height(root);
int max_width_possible=2*h+1;
compute_vertical_sum(root, h,vertical_sum);
for(int i=0; i <max_width_possible; i++)
if ( vertical_sum[i] > 0 )
printf("%d ",vertical_sum[i]);
getchar();
return 0;
}
No comments:
Post a Comment