University of California, Berkeley
EECS Department - Computer Science Division

CS3 Lecture 20 : Trees


Overview of today's lecture


Review

Lists


Trees

 
 ...how Computer Scientists think of trees. Example tree of the world 

Overview

What good are trees?

Selectors and Constructors

(define (leaf? node)
==>
(define (make-leaf datum)  ;; called leaf in the book
  (make-node datum '()))
(define (make-leaves datum-list) ;; called cities in the book
  (map make-leaf datum-list))

Representing Trees as Lists

(define (make-node datum children)
  (cons datum children))

(define (datum node)
  (car node))

(define (children node)
  (cdr node))

Example: California and 3 Cities

*our-state*
(California and 3 cities)

  • Pretend CA has three cities of interest:
    • SF
    • Berkeley
    • LA.
  • It's represented as:
(root-datum child1 child2 ... childN) (ca (sf) (berkeley) (la))
Tree Representation in Scheme

(make-node 'ca (list 'sf 'berkeley 'la))
(make-node 'ca (list (cons 'sf '()) (cons 'berkeley '()) (cons 'la '())))
: (make-node 'ca 
             (list (make-node 'sf '())
                   (make-node 'berkeley '())
                   (make-node 'la '())))
(ca (sf) (berkeley) (la))
: (define *our-state* (make-node 'ca (make-leaves '(sf berkeley la)))
(ca (sf) (berkeley) (la))

Abstract Data Types (ADT)

Another example: *number-tree*

*number-tree*

  • This is the same idea as the worlds tree above
  • You can think of this tree as representing the apartment #s of a family. Grandpa lives at #6, his two children at #2 and #4, etc.
(root-datum child1 child2 ... childN)
(define *number-tree*
  (make-node 
    6 
    (list (make-node 2 (make-leaves '(3 8)))
          (make-node 
            4 
            (list (make-leaf 16)
                  (make-node 1 (make-leaves '(10 4))))))))
(6 (2 (3) (8)) (4 (16) (1 (10) (4))))
 Tree Representation in Scheme

Mutual Recursion Example : tree-every

(define (my-every fn s)
  (if (empty? s)
      '()
      (se (fn (first s))
          (my-every fn (bf s)))))
(define (tree-every fn node)
  (make-node (fn (datum node))
             (tree-every-forest fn (children node))))

(define (tree-every-forest fn forest)
  (if (null? forest)
      '()
      (cons (tree-every fn (car forest))
            (tree-every-forest fn (cdr forest)))))

: (tree-every square *number-tree*)
(36 (4 (9) (64)) (16 (256) (1 (100) (16))))
(define (tree-every-using-map fn node)
  (make-node (fn (datum node))
             (map (lambda (child) (tree-every-using-map fn child))
                  (children node) )))

: (tree-every-using-map square *number-tree*)
(36 (4 (9) (64)) (16 (256) (1 (100) (16))))

Another example: tree-sum

(define (tree-sum node)
==>
==>

: (tree-sum *value-tree*)
54

Sample problems


Summary

Next Time

Puzzle : What Color is your Hat? [Former CS3 superstudent Alex Kozlowski]

(rear) <O O> O> O> (front)

Game : Four in a Row (aka "Connect Four") ["Pentagames" by Pentagram, Fireside Publishing, 1990]

             
             
             
             
             
             

Blank Board

             
             
 

o
    o   o
  x o x o o x
  x x o o x x
x x x o x o o

Example Game (o won)