Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from...
-
Upload
junior-matthew-harvey -
Category
Documents
-
view
217 -
download
0
Transcript of Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from...
![Page 1: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/1.jpg)
Binary Tree Applications
Chapter 6.6
1
![Page 2: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/2.jpg)
107 - Trees
Parse Trees• What is parsing?
• Originally from language study
• The breaking up of sentences into component parts e.g. noun phrase
• In computing compilers and interpreters parse programming languages.
• One aspect is parsing expressions.
2
![Page 3: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/3.jpg)
107 - Trees
Expression Trees• The leaves are values and
the other nodes are operators.
• We can use them to represent and evaluate the expression.
• We work up from the bottom evaluating subtrees.
• Compilers can use this to generate efficient code - e.g. how many registers are needed to calculate this expression. 3
![Page 4: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/4.jpg)
107 - Trees
Tokens• Parsing starts with recognising tokens.
• A token is a symbol made up of one or more characters (commonly separated by white space).
• e.g. a variable name or a number or an operator “+”.
• For an expression tree the tokens are numbers, operators and parentheses.
4
![Page 5: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/5.jpg)
107 - Trees
Parsing Rules
• As we identify tokens we can apply rules to what we should do.
• If the expression is fully parenthesised
• a left parenthesis “(“ starts a subtree
• a right parenthesis “)” finishes a subtree
5
![Page 6: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/6.jpg)
107 - Trees
4 Rules1.If the current token is a ‘(’, add a new node as the left child of the current node, and descend to the left child.
2.If the current token is in the list [‘+’,’−’,’*’,‘/’], set the root value of the current node to the operator represented by the current token. Add a new node as the right child of the current node and descend to the right child.
3.If the current token is a number, set the root value of the current node to the number and return to the parent.
4.If the current token is a ‘)’, go to the parent of the current node. 6
![Page 7: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/7.jpg)
107 - Trees
(3 + (4 * 5))
7
Current node
![Page 8: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/8.jpg)
107 - Trees
(3 + (4 * 5))
8
Current node
![Page 9: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/9.jpg)
107 - Trees
(3 + (4 * 5))
9
3
Current node
![Page 10: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/10.jpg)
107 - Trees
(3 + (4 * 5))
10
+
3 Current node
![Page 11: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/11.jpg)
107 - Trees
(3 + (4 * 5))
11
+
3
Current node
![Page 12: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/12.jpg)
107 - Trees
(3 + (4 * 5))
12
+
3
4
Current node
![Page 13: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/13.jpg)
107 - Trees
(3 + (4 * 5))
13
+
3 *
4
![Page 14: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/14.jpg)
107 - Trees
(3 + (4 * 5))
14
+
3 *
4 5
Current node
![Page 15: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/15.jpg)
107 - Trees
(3 + (4 * 5))
15
+
3 *
4 5
Current node
![Page 16: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/16.jpg)
107 - Trees
(3 + (4 * 5))
16
+
3 *
4 5
![Page 17: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/17.jpg)
107 - Trees
Your turn
17
• Generate the expression tree for
((2 * ((3 - 4) + 6)) + 2)
![Page 18: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/18.jpg)
107 - Trees
Keeping Track of the Parent
• We need to be able to move back up the tree.
• So we need to keep track of the parent of the current working node.
• We could do this with links from each child node back to its parent.
• Or we could store the tree in a list and use the 2 x n trick (if the tree is not complete - most won’t be) then there will be lots of empty space in this list.
• Or we could push the parent node onto a stack as we move down the tree and pop parent nodes off the stack when we move back up.
18
![Page 19: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/19.jpg)
107 - Trees
Build the tree codeset up
def build_expression_tree(parenthesized_expression): """Builds an expression parse tree. parenthesized_expression -- a fully parenthesized expression with spaces between tokens """ token_list = parenthesized_expression.split() parent_stack = Stack() expression_tree = BinaryTree('') parent_stack.push(expression_tree) current_tree = expression_tree
19
![Page 20: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/20.jpg)
107 - Trees
Implementing the rules
for token in token_list: if token == '(': current_tree.insert_left('') parent_stack.push(current_tree) current_tree = current_tree.get_left_child()
20
1.If the current token is a ‘(’, add a new node as the left child of the current node, and descend to the left child.
![Page 21: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/21.jpg)
107 - Trees
Implementing the rules
elif token in ['+', '-', '*', '/']: current_tree.set_value(token) current_tree.insert_right('') parent_stack.push(current_tree) current_tree = current_tree.get_right_child()
21
2.If the current token is in the list [‘+’,‘−’,‘*’,‘/’], set the root value of the current node to the operator represented by the current token. Add a new node as the right child of the current node and descend to the right child.
![Page 22: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/22.jpg)
107 - Trees
Implementing the rules
elif is_number(token): current_tree.set_value(float(token)) current_tree = parent_stack.pop()
22
3.If the current token is a number, set the root value of the current node to the number and return to the parent.
def is_number(token): """Check if the token is a number.""" try: float(token) except: return False else: return True
![Page 23: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/23.jpg)
107 - Trees
Implementing the rules
elif token == ')': current_tree = parent_stack.pop()else: raise ValueError
23
4.If the current token is a ‘)’, go to the parent of the current node.
![Page 24: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/24.jpg)
107 - Trees
Evaluating the expression
• Once we have generated the expression tree we can easily evaluate the expression.
• In a compiler the expression would contain variables which we wouldn’t know the value of until the program ran, so the evaluation would be done at run time.
24
![Page 25: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/25.jpg)
107 - Trees
How would you evaluate?
25
+
3 *
4 5
evaluate this subtree
![Page 26: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/26.jpg)
107 - Trees
Algorithm• To evaluate the subtree under a node
• if the node has children
• the node holds an operator
• return the result of applying the operator on the left and right subtrees
• else the node held a number
• return the number
26
![Page 27: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/27.jpg)
107 - Trees
Evaluation Code
import operatordef evaluate(expression_tree): """Return the result of evaluating the expression.""" token = expression_tree.get_value()
operations = {'+':operator.add, '-':operator.sub, '*':operator.mul, ‘/':operator.truediv}
left = expression_tree.get_left_child() right = expression_tree.get_right_child() if left and right: return operations[token](evaluate(left), evaluate(right)) else: return token
27
![Page 28: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/28.jpg)
107 - Trees
What is that operator stuff?
• The operator module provides functions to add, subtract etc.
• We use a dictionary “operations” to connect the tokens “+”, “-”, “*” and “/” with the corresponding function.
• The line
operations[token](evaluate(left), evaluate(right))
evokes the function on its parameters.
28
![Page 29: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/29.jpg)
107 - Trees
Tree TraversalsText book Section 6.7
• With a binary tree we can recursively travel through all of the nodes (or traverse) in three standard ways.
• We can deal with the node first then deal with the left subtree, then the right subtree.
• This is a preorder traversal.
• We can deal with the left subtree, then with the node, then with the right subtree.
• This is an inorder traversal (and as we will see this keeps things in order).
• We can deal with the left subtree, then the right subtree and lastly the node itself.
• This is a postorder traversal (we used this to evaluate expression trees).
29
![Page 30: Binary Tree Applications Chapter 6.6 1. 107 - Trees Parse Trees What is parsing? Originally from language study The breaking up of sentences into component.](https://reader030.fdocuments.in/reader030/viewer/2022032704/56649d6e5503460f94a4f1b8/html5/thumbnails/30.jpg)
107 - Trees
Code for printing tree traversals
def print_preorder(tree): """Print the preorder traversal of the tree.""" if tree: print(tree.get_value(), end=' ') print_preorder(tree.get_left_child()) print_preorder(tree.get_right_child()) def print_postorder(tree): """Print the postorder traversal of the tree.""" if tree: print_postorder(tree.get_left_child()) print_postorder(tree.get_right_child()) print(tree.get_value(), end=' ') def print_inorder(tree): """Print the inorder traversal of the tree.""" if tree: print_inorder(tree.get_left_child()) print(tree.get_value(), end=' ') print_inorder(tree.get_right_child())
30