340 likes | 360 Views
This text provides an overview of trees, including definitions, abstract data types, and traversal algorithms. It covers both general trees and binary trees, along with data structures and terminology. Examples and exercises are included to reinforce understanding.
E N D
Outline and Reading • Tree Definitions and ADT (§7.1) • Tree Traversal Algorithms for General Trees (preorder and postorder) (§7.2) • BinaryTrees (§7.3) • Data structures for trees (§7.1.4 and §7.3.4) • Traversals of Binary Trees (preorder, inorder, postorder) (§7.3.6) • Euler Tours (§7.3.7)
Computers”R”Us Sales Manufacturing R&D US International Laptops Desktops Europe Asia Canada What is a Tree • In Computer Science, a tree is an abstract model of a hierarchical structure • A tree consists of nodes with a parent-child relation • Applications: • Organization charts • File systems
A C B D G E F H K I J Tree Terminology • Root: node without parent (A) • Internal node: node with at least one child (A, B, C, F) • Leaf (aka External node): node without children (E, I, J, K, G, H, D) • Ancestors of a node: parent, grandparent, great-grandparent, etc. • Depth of a node: number of ancestors • Height of a tree: maximum depth of any node (3) • Descendant of a node: child, grandchild, great-grandchild, etc. • Subtree: tree consisting of a node and its descendants subtee
A D B C E G H F K I J Exercise: Trees • Answer the following questions about the tree shown on the right: • What is the size of the tree (number of nodes)? • Classify each node of the tree as a root, leaf, or internal node • List the ancestors of nodes B, F, G, and A. Which are the parents? • List the descendents of nodes B, F, G, and A. Which are the children? • List the depths of nodes B, F, G, and A. • What is the height of the tree? • Draw the subtrees that are rooted at node F and at node K.
Tree ADT • Query methods: • boolean isInternal(p) • boolean isLeaf (p) • boolean isRoot(p) • Update methods: • swapElements(p, q) • object replaceElement(p, o) • Additional update methods may be defined by data structures implementing the Tree ADT • We use positions to abstract nodes • Generic methods: • integer size() • boolean isEmpty() • objectIterator elements() • positionIterator positions() • Accessor methods: • position root() • position parent(p) • positionIterator children(p)
A Linked Structure for General Trees • A node is represented by an object storing • Element • Parent node • Sequence of children nodes • Node objects implement the Position ADT B A D F B A D F C E C E
A Linked Structure for General Trees • A node is represented by an object storing • Element • Parent node • Sequence of children nodes • Node objects implement the Position ADT B A D F B A D F C E C E
A Linked Structure for General Trees • A node is represented by an object storing • Element • Parent node • Sequence of children nodes • Node objects implement the Position ADT B A D F B A D F C E C E
A Linked Structure for General Trees • A node is represented by an object storing • Element • Parent node • Sequence of children nodes • Node objects implement the Position ADT B A D F B A D F C E C E
1 Data Structures & Algorithms 2 9 5 2. Object-Oriented Design 1. A C++ Primer Bibliography 6 3 7 4 8 2.2 Inheritance and Polymorphism 2.1 Goals, Principles, and Patterns 1.1 Basic C++ Programming Elements 1.2 Expressions 2.3 Templates Preorder Traversal • A traversal visits the nodes of a tree in a systematic manner • In a preorder traversal, a node is visited before its descendants • Application: print a structured document Algorithm preOrder(v) visit(v) for each child w of v preOrder(w)
A D B C E G H F K I J Exercise: Preorder Traversal • In a preorder traversal, a node is visited before its descendants • List the nodes of this tree in preorder traversal order. Algorithm preOrder(v) visit(v) for each child w of v preOrder (w)
Postorder Traversal • In a postorder traversal, a node is visited after its descendants • Application: compute space used by files in a directory and its subdirectories Algorithm postOrder(v) for each child w of v postOrder(w) visit(v) 9 cs16/ 8 3 7 todo.txt1K homeworks/ programs/ 4 5 6 1 2 Robot.java20K h1c.doc3K h1nc.doc2K DDR.java10K Stocks.java25K
A D B C E G H F K I J Exercise: Postorder Traversal • In a postorder traversal, a node is visited after its descendants • List the nodes of this tree in postorder traversal order. Algorithm postOrder(v) for each child w of v postOrder(w) visit(v)
Binary Tree • A binary tree is a tree with the following properties: • Each internal node has two children • The children of a node are an ordered pair • We call the children of an internal node left child and right child • Alternative recursive definition: a binary tree is either • a tree consisting of a single node, or • a tree whose root has an ordered pair of children, each of which is a binary tree • Applications: • arithmetic expressions • decision processes • searching A B C D G E F H I
+ 2 - 3 b a 1 Arithmetic Expression Tree • Binary tree associated with an arithmetic expression • internal nodes: operators • leaves: operands • Example: arithmetic expression tree for the expression (2 (a - 1) + (3 b))
Decision Tree • Binary tree associated with a decision process • internal nodes: questions with yes/no answer • leaves: decisions • Example: dining decision Want a fast meal? No Yes How about coffee? On expense account? Yes No Yes No Starbucks Antonio’s Veritas Chili’s
Properties of Binary Trees • Notation n number of nodes l number of leaves i number of internal nodes h height • Properties: • l = i +1 • n =2l -1 • h i • h (n -1)/2 • l 2h • h log2l • h log2 (n +1)-1
Properties of Binary Trees • Complete binary tree with height h • All 2h-1 nodes exist at height h-1 • Nodes at level h fill up left to right
The BinaryTree ADT extends the Tree ADT, i.e., it inherits all the methods of the Tree ADT Additional methods: position leftChild(p) position rightChild(p) position sibling(p) Update methods may be defined by data structures implementing the BinaryTree ADT BinaryTree ADT
D C A B E A Linked Structure for Binary Trees • A node is represented by an object storing • Element • Parent node • Left child node • Right child node • Node objects implement the Position ADT B A D C E
Inorder Traversal • In an inorder traversal a node is visited after its left subtree and before its right subtree • Application: draw a binary tree • x(v) = inorder rank of v • y(v) = depth of v Algorithm inOrder(v) if isInternal(v) inOrder(leftChild(v)) visit(v) if isInternal(v) inOrder(rightChild(v)) 6 2 8 1 4 7 9 3 5
Exercise: Inorder Traversal • In an inorder traversal a node is visited after its left subtree and before its right subtree • List the nodes of this tree in inorder traversal order. A B C E G H F Algorithm inOrder(v) if isInternal(v) inOrder(leftChild(v)) visit(v) if isInternal(v) inOrder(rightChild(v)) K I
Exercise: Preorder & InOrder Traversal • Draw a (single) binary tree T, such that • Each internal node of T stores a single character • A preorder traversal of T yields EXAMFUN • An inorder traversal of T yields MAFXUEN
+ 2 - 3 b a 1 Print Arithmetic Expressions • Specialization of an inorder traversal • print operand or operator when visiting node • print “(“ before traversing left subtree • print “)“ after traversing right subtree Algorithm printExpression(v) if isInternal(v) print(“(’’) printExpression(leftChild(v)) print(v.element()) if isInternal(v) printExpression(rightChild(v)) print (“)’’) ((2 (a - 1)) + (3 b))
+ 2 - 3 b a 1 Evaluate Arithmetic Expressions • Specialization of a postorder traversal • recursive method returning the value of a subtree • when visiting an internal node, combine the values of the subtrees Algorithm evalExpr(v) if isLeaf(v) return v.element() else x evalExpr(leftChild(v)) y evalExpr(rightChild(v)) operator stored at v return x y
Exercise: Arithmetic Expressions • Draw an expression tree that has • Four leaves, storing the values 2, 4, 8, and 8 • 3 internal nodes, storing operations +, -, *, / (operators can be used more than once, but each internal node stores only one) • The value of the root is 24
Exercise: Arithmetic Expressions • Draw an expression tree that has • Four leaves, storing the values 2, 4, 8, and 8 • 3 internal nodes, storing operations +, -, *, / (operators can be used more than once, but each internal node stores only one) • The value of the root is 24 + + 8 2 4 8
Exercise: Arithmetic Expressions • Draw an expression tree that has • Four leaves, storing the values 1, 3, 4, and 8 • 3 internal nodes, storing operations +, -, *, / (operators can be used more than once, but each internal node stores only one) • The value of the root is 24
Euler Tour Traversal • Generic traversal of a binary tree • Includes as special cases the preorder, postorder and inorder traversals • Walk around the tree and visit each node three times: • on the left (preorder) • from below (inorder) • on the right (postorder) + L R B 2 - 3 2 5 1
Euler Tour Traversal Algorithm eulerTour(p) left-visit-action(p) if isInternal(p) eulerTour(p.left()) bottom-visit-action(p) if isInternal(p) eulerTour(p.right()) right-visit-action(p) End Algorithm + L R B 2 - 3 2 5 1
+ 2 - 3 b a 1 Print Arithmetic Expressions • Specialization of an Euler Tour traversal • Left-visit-action: if node is internal, print “(“ • Bottom-visit-action: print value or operator stored at node • Right-visit-action: if node is internal, print “)” Algorithm printExpression(p) if isExternal(p) then print value stored at p Else print “(“ printExpression(p.left()) Print the operator stored at p printExpression(p.right()) print “)” Endif End Algorithm ((2 (a - 1)) + (3 b))
Template Method Pattern classEulerTour {protected:BinaryTree* tree; virtualvoidvisitLeaf(Position p, Result r) { } virtualvoidvisitLeft(Position p, Result r) { }virtual void visitBelow(Position p, Result r) { }virtual void visitRight(Position p, Result r) { }inteulerTour(Position p) { Result r = initResult();if (tree–>isLeaf(p)) { visitLeaf(p, r); } else { visitLeft(p, r);r.leftResult = eulerTour(tree–>leftChild(p));visitBelow(p, r);r.rightResult = eulerTour(tree–>rightChild(p)); visitRight(p, r);returnr.finalResult; } // … other details omitted • Generic algorithm that can be specialized by redefining certain steps • Implemented by means of an abstract C++ class • Visit methods that can be redefined by subclasses • Template method eulerTour • Recursively called on the left and right children • A Result object with fields leftResult, rightResult andfinalResultkeeps track of the output of the recursive calls to eulerTour
Specializations of EulerTour • We show how to specialize class EulerTour to evaluate an arithmetic expression • Assumptions • External nodes support a function value(), which returns the value of this node. • Internal nodes provide a function operation(int, int), which returns the result of some binary operator on integers. class EvaluateExpression : public EulerTour {protected:void visitLeaf(Position p, Result r) { r.finalResult = p.element().value(); } void visitRight(Position p, Result r) { Operator op = p.element().operator(); r.finalResult = p.element().operation( r.leftResult, r.rightResult); } // … other details omitted};