Trees
Build a Binary Tree
Create a fixed seven-node binary tree and render its shape.
Algorithm
The canonical tree is 4(2(1,3),6(5,7)), so this Fortran DSA
implementation can be compared directly with the rest of the DSA track.
Basic Implementation
basic.f90
program main
implicit none
integer :: value(7), left(7), right(7)
integer :: queue(8), front, back, output(7), n, id
character(len=128) :: out
call setup(value, left, right)
out = ''
call render_node(4, value, left, right, out)
print '(A)', trim(out)
contains
subroutine setup(value, left, right)
integer, intent(out) :: value(7), left(7), right(7)
value = [1,2,3,4,5,6,7]; left = 0; right = 0
left(4) = 2; right(4) = 6; left(2) = 1; right(2) = 3; left(6) = 5; right(6) = 7
end subroutine setup
subroutine append(out, text)
character(len=*), intent(inout) :: out
character(len=*), intent(in) :: text
out = trim(out) // text
end subroutine append
recursive subroutine render_node(id, value, left, right, out)
integer, intent(in) :: id, value(7), left(7), right(7)
character(len=*), intent(inout) :: out
character(len=16) :: buf
if (id == 0) then; call append(out, '_'); return; end if
write(buf, '(I0)') value(id); call append(out, trim(buf))
if (left(id) /= 0 .or. right(id) /= 0) then
call append(out, '('); call render_node(left(id), value, left, right, out); call append(out, ',')
call render_node(right(id), value, left, right, out); call append(out, ')')
end if
end subroutine render_node
recursive subroutine preorder(id, value, left, right, output, n)
integer, intent(in) :: id, value(7), left(7), right(7)
integer, intent(inout) :: output(7), n
if (id == 0) return
n = n + 1; output(n) = value(id)
call preorder(left(id), value, left, right, output, n)
call preorder(right(id), value, left, right, output, n)
end subroutine preorder
subroutine print_list(output, n)
integer, intent(in) :: output(7), n
integer :: i
write(*, '(A)', advance='no') '['
do i = 1, n
if (i > 1) write(*, '(A)', advance='no') ', '
write(*, '(I0)', advance='no') output(i)
end do
print '(A)', ']'
end subroutine print_list
logical function search_value(id, target, value, left, right)
integer, intent(in) :: id, target, value(7), left(7), right(7)
integer :: cur
cur = id
do while (cur /= 0)
if (target == value(cur)) then; search_value = .true.; return; end if
if (target < value(cur)) then; cur = left(cur); else; cur = right(cur); end if
end do
search_value = .false.
end function search_value
end program main
Complexity
- Time: O(n)
- Space: O(n)
Implementation notes
- Render tree structure explicitly instead of printing node objects.
- The replay highlights the node, traversal state, queue, path, or search cursor that changes at each step.
node links
A node stores one value plus references to its left and right children.