COMP 250 Lecture 21 binry trees, expression trees Oct. 27, 2017 1
Binry tree: ech node hs t most two children. 2
Mximum number of nodes in binry tree? Height h (e.g. 3) 3
Mximum number of nodes in binry tree? Height h (e.g. 3) n = 1 + 2 + 4 + 8 + 2 h = 2 h+1 1 4
Minimum number of nodes in binry tree? Height h (e.g. 3) n = h + 1 5
clss BTree<T>{ BTNode<T> root; : clss BTNode<T>{ T e; BTNode<T> leftchild; BTNode<T> rightchild; : 6
Binry Tree Trversl (depth first) Rooted tree (lst lecture) Binry tree depthfirst(root){ if (root is not empty){ visit root for ech child of root depthfirst( child ) 7
Binry Tree Trversl (depth first) Rooted tree (lst lecture) Binry tree preorder(root){ if (root is not empty){ visit root for ech child of root preorder( child ) 8
Binry Tree Trversl (depth first) Rooted tree (lst lecture) Binry tree preorder(root){ if (root is not empty){ visit root for ech child of root preorder( child ) preorderbt (root){ if (root is not empty){ visit root preorderbt( root.left ) preorderbt( root.right ) 9
preorderbt (root){ if (root is not empty){ visit root preorderbt( root.left ) preorderbt( root.right ) postorderbt (root){ 10
preorderbt (root){ if (root is not empty){ visit root preorderbt( root.left ) preorderbt( root.right ) postorderbt (root){ if (root is not empty){ postorderbt(root.left) postorderbt(root.right) visit root 11
preorderbt (root){ if (root is not empty){ visit root preorderbt( root.left ) preorderbt( root.right ) postorderbt (root){ if (root is not empty){ postorderbt(root.left) postorderbt(root.right) visit root inorderbt (root){ if (root is not empty){ inorderbt(root.left) visit root inorderbt(root.right) 12
preorderbt (root){ if (root is not empty){ visit root preorderbt( root.left ) preorderbt( root.right ) postorderbt (root){ if (root is not empty){ postorderbt(root.left) postorderbt(root.right) visit root inorderbt (root){ if (root is not empty){ inorderbt(root.left) visit root inorderbt(root.right) 13
Exmple Pre order: b c In order: d f g Post order: e 14
Exmple Pre order: b d e c f g b c In order: d f g Post order: e 15
Exmple Pre order: b d e c f g b c In order: d e b f c g d f g Post order: e 16
Exmple Pre order: b d e c f g b c In order: d e b f c g d f g Post order: e d b f g c e 17
Expression Tree e.g. 3 + 4 * 2 3 + (4 * 2) + 3 * 4 2 18
Expression Tree e.g. 3 + 4 * 2 (3 + 4) * 2 3 + (4 * 2) * + 2 3 4 + 3 * 4 2 19
My Windows clcultor sys 3 + 4 * 2 = 14. Why? (3 + 4) * 2 = 14. Wheres. if I google 3+4*2, I get 11. 3 + (4*2) = 11. 20
We cn mke expressions using binry opertors +, -, *, /, ^ e.g. b / c + d * e ^ f ^ g ^ is exponentition: e ^ f ^ g = e ^ (f ^ g) We don t consider unry opertors e.g. 3 + -4 = 3 + (-4) Opertor precedence ordering mkes brckets unnecessry. ( (b / c)) + (d * (e ^ (f ^ g))) 21
Expression Tree b / c + d * e ^ f ^ g ( (b / c)) + (d (e ^ (f ^ g))) + Internl nodes re opertors. Leves re opernds. * / d b c e f g 22
An expression tree cn be wy of thinking bout the ordering of opertions used when evluting n expression. But to be concrete, let s ssume we hve binry tree dt structure. + * / d b c e f g 23
If we trverse n expression tree, nd print out the node lbel, wht is the expression printed out? / + d * b c e f g preorder trversl gives 24
If we trverse n expression tree, nd print out the node lbel, wht is the expression printed out? / + d * b c e f g preorder trversl gives : + / b c * d ^ e ^ f g 25
If we trverse n expression tree, nd print out the node lbel, wht is the expression printed out? / + d * b c e f g preorder trversl gives : + / b c * d ^ e ^ f g inorder trversl gives : 26
If we trverse n expression tree, nd print out the node lbel, wht is the expression printed out? / + d * b c e f g preorder trversl gives : inorder trversl gives : + / b c * d ^ e ^ f g b / c + d * e ^ f ^ g 27
If we trverse n expression tree, nd print out the node lbel, wht is the expression printed out? / + d * b c e f g preorder trversl gives : inorder trversl gives : + / b c * d ^ e ^ f g b / c + d * e ^ f ^ g postorder trversl gives : 28
If we trverse n expression tree, nd print out the node lbel, wht is the expression printed out? / + d * b c e f g preorder trversl gives : inorder trversl gives : + / b c * d ^ e ^ f g b / c + d * e ^ f ^ g postorder trversl gives : b c / - d e f g ^ ^ * + 29
Prefix, infix, postfix expressions * b prefix: infix: * b * b postfix: b * 30
Infix, prefix, postfix expressions bseexp = vrible integer op = + - * / ^ preexp = bseexp op preexp preexp 31
Infix, prefix, postfix expressions bseexp = vrible integer op = + - * / ^ preexp = bseexp op preexp prefexp inexp = bseexp inexp op inexp postexp = bseexp postexp postexp op Use only one. 32
If we trverse n expression tree, nd print out the node lbel, wht is the expression printed out? (sme question s four slides go) b / c + d * e f g preorder trversl gives prefix expression: inorder trversl gives infix expression: + / b c * d ^ e ^ f g b / c + d * e ^ f ^ g postorder trversl gives postfix expression: b c / - d e f g ^ ^ * + 33
Prefix expressions clled Polish Nottion (fter Polish logicin Jn Lucsewicz 1920 s) Postfix expressions re clled Reverse Polish nottion (RPN) Some clcultors (esp. Hewlett Pckrd) require users to input expressions using RPN. 34
Prefix expressions clled Polish Nottion (fter Polish logicin Jn Lucsewicz 1920 s) Postfix expressions re clled Reverse Polish nottion (RPN) Some clcultors (esp. Hewlett Pckrd) require users to input expressions using RPN. Clculte 5 * 4 + 3 : 5 <enter> 4 <enter> * <enter> 3 <enter> + <enter> No = symbol on keybord. 35
Suppose we re given n expression tree. How cn we evlute the expression? + * / d b c e f g 36
We use postorder trversl (recursive lgorithm): evlexptree(root){ if (root is lef) // root is number return vlue else{ // the root is n opertor firstopernd = evlexptree( root.leftchild ) secondopernd = evlexptree( root.rightchild ) return evlute(firstopernd, root, secondopernd) 37
Wht if we re not given n expression tree? Infix expressions re wkwrd to evlute becuse of precedence ordering. Infix expressions with brckets re reltively esy to evlute e.g. Assignment 2. 38
Assignment 2 (ignore cse of ++, --) for ech token in expression { if token is number vluestck.push(token) else if token is ) { // then you hve binry expression opertor = opstck.pop() opernd2 = vluestck.pop() opernd1 = vluestck.pop() numstck.push( opernd1 opertor opernd2) return vluestck.pop() 39
Assignment 2 (ignore cse of ++, --) for ech token in expression { if token is number vluestck.push(token) else if token is ) { // then you hve binry expression opertor = opstck.pop() opernd2 = vluestck.pop() opernd1 = vluestck.pop() numstck.push( opernd1 opertor opernd2) return vluestck.pop() 40
Infix expressions with brckets re reltively esy to evlute e.g. with two stcks s in Assignment 2. Postfix expressions without brckets re esy to evlute. Use one stck, nmely for vlues (not opertors). 41
Exmple: Use stck to evlute postfix expression: b c / - d e f g ^ ^ * + + * / d stck over time b c This expression tree is not given. It is shown here so tht you cn visulize the expression more esily. e f g 42
Exmple: Use stck to evlute postfix expression: b c / - d e f g ^ ^ * + b b c / + d * stck over time b c This expression tree is not given. It is shown here so tht you cn visulize the expression more esily. e f g 43
Use stck to evlute postfix expression: b c / - d e f g ^ ^ * + stck over time b b c (b c / ) We don t push opertor onto stck. Insted we pop vlue twice, evlute, nd push. b / c + d * e f g 44
Useon: b c / - d e f g ^ ^ * + stck over time b b c (b c / ) ( ( b c / ) - ) Now there is one vlue on the stck. b / c + d * e f g 45
tck to evl: b c / - d e f g ^ ^ * + stck over time b b c (b c / ) ( ( b c / ) - ) : ( ( b c / ) - ) d e f g b / c + d * e f g Now there re five vlues on the stck. 46
Use stck to evlute postfix expression: b c / - d e f g ^ ^ * + stck over time b b c ( b c / ) ( ( b c / ) - ) : ( ( b c / ) - ) d e f g ( ( b c / ) - ) d e (f g ^) b / c + d * e f g Now there re four vlues on the stck. 47
Use stck to evlute postfix expression: b c / - d e f g ^ ^ * + stck over time b b c ( b c / ) ( ( b c / ) - ) : ( ( b c / ) - ) d e f g ( ( b c / ) - ) d e (f g ^) ( ( b c / ) - ) d ( e (f g ^) ^ ) b / c + d * e f g Three vlues on the stck. 48
Use stck to evlute postfix expression: b c / - d e f g ^ ^ * + stck over time b b c ( b c / ) ( ( b c / ) - ) : ( ( b c / ) - ) d e f g ( ( b c / ) - ) d e (f g ^) ( ( b c / ) - ) d ( e (f g ^) ^ ) ( ( b c / ) - ) (d ( e (f g ^) ^ ) * ) b / c + d * e f g Two vlues on the stck. 49
Use stck to evlute postfix expression: b c / - d e f g ^ ^ * + stck over time b b c ( b c / ) / ( ( b c / ) - ) b : ( ( b c / ) - ) d e f g ( ( b c / ) - ) d e (f g ^) ( ( b c / ) - ) d ( e (f g ^) ^ ) ( ( b c / ) - ) (d ( e (f g ^) ^ ) * ) ( ( ( b c / ) - ) (d ( e (f g ^) ^ ) * ) + ) c + d * e f g One vlue on the stck. 50
Algorithm: Use stck to evlute postfix expression Let expression be list of elements. s = empty stck cur = first element of expression list while (cur!= null){ if ( cur.element is bse expression ) s.push( cur.element ) else{ // cur.element is n opertor opernd2 = s.pop() opernd1 = s.pop() opertor = cur.element // for clrity only s.push( evlute( opernd1, opertor, opernd2 ) ) cur = cur.next 51
Algorithm: Use stck to evlute postfix expression Let expression be list of elements. s = empty stck cur = first element of expression list while (cur!= null){ if ( cur.element is bse expression ) s.push( cur.element ) else{ // cur.element is n opertor opernd2 = s.pop() opernd1 = s.pop() opertor = cur.element // for clrity only s.push( evlute( opernd1, opertor, opernd2 ) ) cur = cur.next 52
ASIDE There re mny vritions of expression tree problems. e.g. Define n lgorithm tht computes postfix expression directly from n infix expression with no brckets. This is not so obvious if you hve to respect precedence ordering e.g. +, -, *, /, ^ http://wcipeg.com/wiki/shunting_yrd_lgorithm 53