| I. | Preliminaries |
| II. | Overview of Stacks and Queues |
| III. | Records and Pointers |
| IV. | Linked Lists |
| V. | Graphs |
| VI. | Trees |
| VII. | Binary Search Trees |
| VIII. | Perfect Trees and Almost Complete Trees |
| IX. | Heaps |
| X. | Sets and Union-Find |
| Procedure | Push (S,a) |
| begin | |
| S[I] := a; | |
| I := I+1; | |
| end |
| function | Pop(S) |
| begin | |
| I := I-1; | |
| return(S[I]); | |
| end |
| function | Top(S) |
| begin | |
| return(S[I-1]); | |
| end |
| Procedure | enqueue(Q,a) |
| begin | |
| Q[T] := a; | |
| T = T - 1 modulo N; | |
| end |
| begin | |
| H := H-1 modulo N; | |
| return (Q[H+1 modulo N]); | |
| end |
| record | name |
| begin | |
| field declarations; | |
| field declarations; | |
| ... | |
| field declarations; | |
| end |
| record | employee |
| begin | |
| char name[1:30] | |
| integer SSN; | |
| char address[1:100] | |
| real salary; | |
| end |
| record | company |
| begin | |
| char name[1:50] | |
| char address[1:100] | |
| employee Z[1:1000] | |
| end |
| Examples: | X.SSN := 123456789; |
| X.salary := X.salary + 1000; |
| Examples: | charpointer p; | intpointer q[1:n]; | employeepointer r; |
| charptr p; | intptr q[1:n]; | employeeptr r; |
| record | employee |
| begin | |
| char name[1:30] | |
| integer SSN; | |
| employeeptr next; | |
| end |
In the three algorithms below, T is a pointer to the tree root, and a a is a key.
| function | search(T,a) | |||
| begin | ||||
| nodeptr p; | ||||
| p=T; | ||||
| while (p != nil | and | p --> key != a) | do | |
| if | a < p --> key | then | ||
| p := p --> left; | ||||
| else | ||||
| p := p --> right; | ||||
| endif | ||||
| endwhile | ||||
| return (p); | ||||
| end search |
| procedure | insert(T,a) |
procedure delete(T,a)
begin
nodeptr p,q,r,s;
integer direction;
p = T;
while (p != nil and p-->key != a) do
if a < p-->key then
q := p;
p := p-->left;
direction := 0;
else
q := p;
p := p-->right;
direction := 1;
endif
endwhile
if p == nil then
return;
elseif p-->left == nil and p-->right == nil then
/* p has no children */
/* delete node pointed to by p and exit */
if direction == 0
q-->left = nil;
else
q-->right = nil
endif
free (p);
elseif p-->left == nil then
/* p has only one child, the right one */
if direction == 0 then
q-->left := p-->right;
/* shortcut from parent to grandchild */
else
q-->right := p-->right;
endif
elseif p-->right == nil then
/* p has only one child, the left one */
if direction == 0 then
q-->left := p-->left;
else
q-->right := p-->left;
endif
else /* p has two children*/
/* find the maximum node in the left subtree*/
/* subtree of p */
s := p-->left;
q := p;
/* now q will be the parent of s , and direction*/
/* will indicate the type of child s is to q*/
direction = 0;
while s-->right != nil do
q := s;
s := s-->right;
direction := 1;
endwhile
/*Now s points to the maximum node in the */
/*left subtree of p*/
p-->key := s-->key;
/* now node s must be deleted. But since s has */
/* no right child, the deletion is done by */
/* deletion or shortcutting */
if s-->left == nil then /* s is a leaf*/
if direction == 0 then
q-->left := nil;
else
q-->right := nil;
endif
free (s);
return;
else /* s has a left child */
if direction == 0 then
q-->left := s-->left;
else
q-->right := s-->left;
endif
free(s)
return;
endif
endif
end delete
| x= root of H; | |
| a=key of x; /* to be returned at the end*/ | |
| remove a from node x; | |
| take the last node (node n), remove its key (call it b), and store b in the root; | |
| remove node n; | |
| /* now we have to restor the heap*/ |
| while | (x has a key bigger than one of its children) do | |
| swap x with the smaller child; | ||
| make x point to that child; | ||
| endwhile |
| /* note the while loop will stop when x becomes smaller */ |
| /* than both its children, or when x becomes a leaf*/ |
| end delete-min |
| create a node of label n+1, and insert a into that node; | |
| let x point to that node; | |
| while (x is smaller than its parent) do |
| swap the key of x with key of the parent of x; | |
| let x point to its parent; |
| endwhile |
| /* this will loop until either x becomes larger than its parent, or it becomes the root*/ |
| PARENT[i]=PARENT[i]+PARENT[j]; /* this computes the total number of nodes in the new tree */ | |
| PARENT[j]=i; | |
| end |
| integer | r=x; | |
| while | (PARENT[r] > 0) do | |
| r = PARENT[r]; | ||
| endwhile |
| /*now r is a root*/ | |
| return(r); |
| if |PARENT[i]| >= |PARENT[j]| then |
| PARENT[i]=PARENT[i]+PARENT[j]; | |
| PARENT[j]=i; |
| else |
| PARENT[j]=PARENT[i]+PARENT[j]; | |
| PARENT[i]=j; |
| endif |
| integer r,s,t; | |
| r=x; | |
| while PARENT[r] > 0 |
| r = PARENT[r]; |
| endwhile | |
| /*now r is a root*/ | |
| s=x; | |
| while s != r do |
| t := s; | |
| s := PARENT[s]; | |
| PARENT[t] := r; |
| endwhile | |
| return (r); |