|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
学二叉树照着老师写的代码 内容是把数学表达式拆成二叉树在计算 比如((3+5)*(3-1))这样的 第一第二块就是定义栈和二叉树 第三部分拆成树 第四部分递归计算 我不知道该怎么验证我写的对不对 后面那几行都是我自己写的但是运行没有任何输出
- class Stack: # 定义一个栈类
- def __init__(self):
- self.items = []
- def isEmpty(self):
- return self.items == []
- def push(self, item):
- self.items.append(item)
- def pop(self):
- return self.items.pop()
- def peek(self):
- return self.items[len(self.items)-1]
- def size(self):
- return len(self.items)
- class BinTree: # 定义一个二叉树类以及其方法
- def __init__(self, rt_obj):
- super().__init__()
- self.key = rt_obj
- self.l_child = None
- self.r_child = None
- def ins_l(self, new_n):
- if self.l_child == None:
- self.l_child = BinTree(new_n)
- else:
- t = BinTree(new_n)
- t.l_child = self.l_child
- self.l_child = t
- def ins_r(self, new_n):
- if self.r_child == None:
- self.r_child = BinTree(new_n)
- else:
- t = BinTree(new_n)
- t.r_child = self.r_child
- self.r_child = t
- def get_root_val(self):
- return self.key
- def set_root_val(self, key):
- self.key = key
- def get_l_child(self):
- return self.l_child
- def get_r_child(self):
- return self.r_child
- def build_parsetree(fpexp): # 把表达式拆分成一个二叉树
- fplist = []
- for i in fpexp:
- fplist.append(i) # 拆分表达式存到一个空列表里
- pStack = Stack() # 定义一个空栈
- eTree = BinTree('') # 空二叉树
- pStack.push(eTree) # 入栈
- cur_tree = eTree # 追踪扫描的字符
- for i in fplist:
- if i == '(':
- cur_tree.ins_l('') # 左括号加一个子树
- pStack.push(cur_tree) # 入栈
- cur_tree = cur_tree.get_l_child() # 追踪扫描的字符
- elif i not in [')', '+', '-', '*', '/']: # 运算数
- cur_tree.set_rt_val(int(i)) # 结点设置为运算数的值
- parent = pStack.pop()
- cur_tree = parent # 出栈 追踪扫描光标
- elif i in ['*', '+', '-', '/']: # 运算符
- cur_tree.set_rt_val(i) # 节点设置为运算符
- cur_tree.ins_r('') # 添加一个右子树
- pStack.push(cur_tree) # 下沉入栈
- cur_tree = cur_tree.get_r_child() # 追踪扫描光标
- elif i == ')': # 右括号
- pStack.pop() # 出栈
- else:
- raise ValueError
- return eTree
- import operator as op
- def evaluate(parse_tree): # 递归求值 这段我自己不是太懂
- ops = {'+': op.add, '-': op.sub, '*': op.mul, '/': op.truediv}
- # 定义一个运算符字典
- l = parse_tree.get_l_child()
- r = parse_tree.get_r_child()
- if l and r:
- fn = parse_tree.get_root_val()
- return fn(evaluate(l), evaluate(r))
- else:
- print('hello world')
- return parse_tree.get_root_val()
-
- m = "((3+2)*(4-2))" # 这段我自己写的想测试下这个程序 但是没反应
- n = build_parsetree(m)
- n.get_root_val()
- o = evaluate(n)
- print(o)
复制代码 |
|