diff options
| author | wanderdoc <wanderdoc@googlemail.com> | 2021-08-15 15:02:42 +0200 |
|---|---|---|
| committer | wanderdoc <wanderdoc@googlemail.com> | 2021-08-15 15:02:42 +0200 |
| commit | e91d4467c0de5f4e61735ddc16ecea93d36aefbf (patch) | |
| tree | 93d5320a58c32c5115f3dbc306e962c059dbdc6e /challenge-125 | |
| parent | 254cb550f1b9f12a4d71ac5fcc1a190fd7ca5f34 (diff) | |
| download | perlweeklychallenge-club-e91d4467c0de5f4e61735ddc16ecea93d36aefbf.tar.gz perlweeklychallenge-club-e91d4467c0de5f4e61735ddc16ecea93d36aefbf.tar.bz2 perlweeklychallenge-club-e91d4467c0de5f4e61735ddc16ecea93d36aefbf.zip | |
Solution to task #2 challenge-125
Diffstat (limited to 'challenge-125')
| -rw-r--r-- | challenge-125/wanderdoc/perl/ch-2.pl | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/challenge-125/wanderdoc/perl/ch-2.pl b/challenge-125/wanderdoc/perl/ch-2.pl new file mode 100644 index 0000000000..90522cb04e --- /dev/null +++ b/challenge-125/wanderdoc/perl/ch-2.pl @@ -0,0 +1,111 @@ +#!perl +use strict; +use warnings FATAL => qw(all); + +=prompt +You are given binary tree as below: + + 1 + / \ + 2 5 + / \ / \ +3 4 6 7 + / \ + 8 10 + / + 9 + +Write a script to find the diameter of the given binary tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. It doesn’t have to pass through the root. +For the above given binary tree, possible diameters (6) are: +3, 2, 1, 5, 7, 8, 9 +or +4, 2, 1, 5, 7, 8, 9 +The length of a path is the number of its edges, not the number of the vertices it connects. So the diameter should be 6, not 7. + +=cut + + + + +use Struct::Dumb; +use List::Util qw(max); +struct Node => [qw( left right value )], named_constructor => 1;; + + +sub createNode +{ + return Node(value => $_[0], left => undef, right => undef); +} + + +sub height_iter +{ + my $node = $_[0]; + + my @queue; + push @queue, $node; + my $height = 0; + + + while ( @queue ) + { + my $size = scalar @queue; + for my $i ( 0 .. $size - 1 ) + { + my $n = shift @queue; + push @queue, $n->left if $n->left; + push @queue, $n->right if $n->right; + + } + $height++; + } + return $height; +} + +sub diameter_iter +{ + + my $node = $_[0]; + my @queue; + push @queue, $node; + + my $diameter = 0; + + while ( @queue ) + { + + my $size = scalar @queue; + + for my $i ( 0 .. $size - 1 ) + { + my $n = shift @queue; + my $height_left = $n->left ? height_iter( $n->left ) : 0; + my $height_right = $n->right ? height_iter( $n->right ) : 0; + $diameter = max($diameter, $height_left + $height_right); # + 1 + + push @queue, $n->left if $n->left; + push @queue, $n->right if $n->right; + } + } + return $diameter; +} + + + + +my $root = createNode(1); +$root->left = createNode(2); +$root->left->left = createNode(3); +$root->left->right = createNode(4); +$root->right = createNode(5); +$root->right->left = createNode(6); +$root->right->right = createNode(7); + + +my $seven = $root->right->right; + +$seven->left = createNode(8); +$seven->left->left = createNode(9); +$seven->right = createNode(10); + +print diameter_iter($root), $/;
\ No newline at end of file |
