280 likes | 424 Views
Chapter 7:Trees. Make Money Fast!. Nancy Amato Parasol Lab, Dept. CSE, Texas A&M University Acknowledgement: These slides are adapted from slides provided with Data Structures and Algorithms in C++, Goodrich, Tamassia and Mount (Wiley 2004). Bank Robbery. Stock Fraud. Ponzi Scheme.
E N D
Chapter 7:Trees Make Money Fast! Nancy Amato Parasol Lab, Dept. CSE, Texas A&M University Acknowledgement: These slides are adapted from slides provided with Data Structures and Algorithms in C++, Goodrich, Tamassia and Mount (Wiley 2004) BankRobbery StockFraud PonziScheme
Outline and Reading • Tree Definitions and ADT (§7.1) • Tree Traversal Algorithms for General Trees (preorder and postorder) (§7.2) • BinaryTrees (§7.3) • Traversals of Binary Trees (preorder, inorder, postorder, and Euler Tour) (§7.3.6) • Template method pattern (§7.3.7) • Data structures for trees (§7.1.4 and §7.3.4) • C++ implementation (§7.1.3 and §7.3.2)
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 • Programming environments
A C B D G E F H K J I 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 C D B E G H F K J I 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
1 Make Money Fast! 2 5 9 1. Motivations 2. Methods References 6 7 8 3 4 2.3 BankRobbery 2.1 StockFraud 2.2 PonziScheme 1.1 Greed 1.2 Avidity 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 C D B E G H F K J I 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 C D B E G H F K J I 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 C B 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 Spike’s Al Forno Café Paragon
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
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
A C B E G H F J I 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. Algorithm inOrder(v) if isInternal(v) inOrder(leftChild(v)) visit(v) if isInternal(v) inOrder(rightChild(v))
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 2 5 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 isExternal(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 1, 5, 6, and 7 • 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 21
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(T,p) left-visit-action(p) if isInternal(p) eulerTour(T,p.left() bottom-visit-action(p) if isInternal(p) eulerTour(T,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(T,p) if isExternal(p) then print value stored at p Else print “(“ printExpression(T,p.left()) Print the operator stored at p printExpression(T,p.right()) print “)” Endif End Algorithm ((2 (a - 1)) + (3 b))
Template Method Pattern class EulerTour {protected: BinaryTree* tree; virtual void visitExternal(Position p, Result r) { } virtual void visitLeft(Position p, Result r) { } virtual void visitBelow(Position p, Result r) { } virtual void visitRight(Position p, Result r) { } int eulerTour(Position p) { Result r = initResult(); if (tree–>isExternal(p)) { visitExternal(p, r); } else { visitLeft(p, r); r.leftResult = eulerTour(tree–>leftChild(p)); visitBelow(p, r); r.rightResult = eulerTour(tree–>rightChild(p)); visitRight(p, r); return r.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 visitExternal(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};