表达式树和查找树的 Python 实现
目录
1二叉表达式树
表达式树是二叉树的一种应用,其树叶是常数或变量,而节点为操作符,构建表达式树的过程与后缀表达式的计算类似,只不过在遇到运算符时不是进行计算,而是将树节点赋值为运算符,并将节点的左右叶子指向两个变量构成一个基本的二叉树后再压入栈中。
Expression Tree:*
|___________
| |
+ *
|_____ |_____
| | | |a b c+
|__| |d c
下面利用代码实现一棵二叉表达式树
完整代码
1 from binary_tree importBinaryTree, TreeNode2 from stack.linked_list_stack importStack3
4
5 classExpressionTree(BinaryTree):6 SIGN = {'+': 1, '-': 1, '*': 2, '/': 2, '(': 3}7
8 defgene_tree_by_postfix(self, expr):9 s =Stack()10 for i inexpr:11 if i inself.SIGN.keys():12 right =s.pop()13 left =s.pop()14 node =TreeNode(i, left, right)15 s.push(node)16 else:17 s.push(TreeNode(i))18 self._root =s.pop()19
20
21 deftest_expression_tree(ep):22 t =ExpressionTree()23 t.gene_tree_by_postfix(ep)24 print('\n------Pre-traversal-------')25 print(t)26
27 print('\n------Post-traversal------')28 t.show(t.post_traversal())29 print('\n-------In-traversal-------')30 t.show(t.in_traversal())31
32
33 if __name__ == '__main__':34 ep = 'a b + c d e + * *'
35 '''
36 *37 |___________38 | |39 + *40 |_____ |_____41 | | | |42 a b c +43 |__44 | |45 d c46 '''
47 test_expression_tree(ep.split(' '))
View Code
分段解释
首先导入二叉树类、树节点类和栈类
1 from binary_tree importBinaryTree, TreeNode2 from stack.linked_list_stack import Stack
接着构建一个表达式树类,基于二叉树进行派生,依照构建表达式树的思路定义一个生成树的方法
1 classExpressionTree(BinaryTree):2 SIGN = {'+': 1, '-': 1, '*': 2, '/': 2, '(': 3}3
4 defgene_tree_by_postfix(self, expr):5 s =Stack()6 for i inexpr:7 if i inself.SIGN.keys():8 right =s.pop()9 left =s.pop()10 node =TreeNode(i, left, right)11 s.push(node)12 else:13 s.push(TreeNode(i))14 self._root = s.pop()
再定义一个测试函数,以三种遍历方式遍历显示表达式树
1 deftest_expression_tree(ep):2 t =ExpressionTree()3 t.gene_tree_by_postfix(ep)4 print('\n------Pre-traversal-------')5 print(t)6
7 print('\n------Post-traversal------')8 t.show(t.post_traversal())9 print('\n-------In-tra