Write a function that computes the sum of all values in a binary tree of integers.
type
node = record
i: integer;
left: ^node;
right: ^node;
end;
pnode = ^node;
function sum(t: pnode): integer;
begin
if t = nil then exit(0)
else exit(t^.i + sum(t^.left) + sum(t^.right));
end;Write a function that returns the height of a binary tree.
uses math; function height(t: pnode): integer; begin if t = nil then exit(0) else exit(1 + max(height(t^.left), height(t^.right))); end;
Write a function that returns true if a binary tree is complete, that is, if every leaf has the same depth and all internal nodes have two children.
Here is a first implementation that uses the height
function from the previous exercise:
function complete(t: pnode): boolean;
begin
if t = nil then exit(true)
else exit((height(t^.left) = height(t^.right)) and
complete(t^.left) and complete(t^.right));
end;If the tree is balanced and has N nodes, the running time of this function follows the recurrence
T(n) = 2 T(n/2) + O(n)
since height runs in linear time. This means that
T(n) = O(n log n)
For a more efficient implementation, we can write a single function that both determines whether a tree is complete and also returns its height if it is complete:
// Return the height of t if it is complete, or -1 otherwise.
function heightComplete(t: pnode): integer;
var
l, r: integer;
begin
if t = nil then exit(0)
else begin
l := heightComplete(t^.left);
r := heightComplete(t^.right);
if (l <> -1) and (r <> -1) and (l = r)
then exit(l + 1)
else exit(-1);
end;
end;For a balanced tree, this function's running time obeys the recurrence
T(n) = 2 * O(n/2) + O(1)
and so T(n) = O(n).