[Java]手动构建表达式二叉树,求值,求后序表达式
Inlet类,这颗二叉树是”人力运维“的:
package com.hy;
public class Inlet {
public static void main(String[] args) throws Exception{
// 手动构造表达式二叉树
Node n4=new Node(NodeType.Digit,4,null,null);
Node n5=new Node(NodeType.Digit,5,null,null);
Node nPlus=new Node(NodeType.OP_Plus,n4,n5);
Node n6=new Node(NodeType.Digit,6,null,null);
Node n2=new Node(NodeType.Digit,2,null,null);
Node nDivide=new Node(NodeType.OP_Divide,n6,n2);
Node n8=new Node(NodeType.Digit,8,null,null);
Node nMinus=new Node(NodeType.OP_Minus,n8,nDivide);
Node root=new Node(NodeType.OP_Multi,nPlus,nMinus);
// 求值
System.out.println("表达式(4+5)*(8-6/2)求值="+root.getValue());
// 后序遍历
System.out.print("表达式(4+5)*(8-6/2)转化为后序表达式为");
postOrder(root);
}
// 后序遍历
private static void postOrder(Node n){
if(n!=null){
postOrder(n.getLeftNode());
postOrder(n.getRightNode());
System.out.print(n);
}
}
}
运行结果如下:
表达式(4+5)*(8-6/2)求值=45.0 表达式(4+5)*(8-6/2)转化为后序表达式为4.0 5.0 + 8.0 6.0 2.0 / - *
Node类 这个类用来表示二叉树节点:
package com.hy;
// 二叉树节点类
public class Node {
private NodeType type;
private float value;
private Node leftNode;
private Node rightNode;
public Node(){
type=NodeType.Undifined;
value=0.0f;
leftNode=null;
rightNode=null;
}
public Node(NodeType type,float value,Node leftNode,Node rightNode){
this.type=type;
this.value=value;
this.leftNode=leftNode;
this.rightNode=rightNode;
}
public Node(NodeType type,Node leftNode,Node rightNode){
this.type=type;
this.value=0;
this.leftNode=leftNode;
this.rightNode=rightNode;
}
public float getValue() throws Exception{
if(this.type==NodeType.Digit){
return value;
}else if(this.type==NodeType.OP_Divide){
return leftNode.getValue()/rightNode.getValue();
}else if(this.type==NodeType.OP_Minus){
return leftNode.getValue()-rightNode.getValue();
}else if(this.type==NodeType.OP_Multi){
return leftNode.getValue()*rightNode.getValue();
}else if(this.type==NodeType.OP_Plus){
return leftNode.getValue()+rightNode.getValue();
}else{
throw new Exception("Not initialize");
}
}
public void setLeftNode(Node leftNode) {
this.leftNode = leftNode;
}
public void setRightNode(Node rightNode) {
this.rightNode = rightNode;
}
public Node getLeftNode() {
return leftNode;
}
public Node getRightNode() {
return rightNode;
}
public String toString(){
if(this.type==NodeType.Digit){
return String.valueOf(value)+" ";
}else if(this.type==NodeType.OP_Divide){
return "/ ";
}else if(this.type==NodeType.OP_Minus){
return "- ";
}else if(this.type==NodeType.OP_Multi){
return "* ";
}else if(this.type==NodeType.OP_Plus){
return "+ ";
}else{
return "? ";
}
}
}
NodeType枚举 用来定义二叉树类型:
package com.hy;
// 节点类型
public enum NodeType {
Undifined,
OP_Plus,
OP_Minus,
OP_Multi,
OP_Divide,
Digit,
}
好了,到此,又把Long long ago学的数据结构又复习了一遍。
--END--2019年9月3日18点42分
[Java]手动构建表达式二叉树,求值,求后序表达式的更多相关文章
- [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)
Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...
- [Java]算术表达式求值之一(中序表达式转后序表达式方案)
第二版请见:https://www.cnblogs.com/xiandedanteng/p/11451359.html 入口类,这个类的主要用途是粗筛用户输入的算术表达式: package com.h ...
- [Java]算术表达式组建二叉树,再由二叉树得到算式的后序和中序表达式
Entry类: package com.hy; import java.io.BufferedReader; import java.io.IOException; import java.io.In ...
- 表达式求值(noip2015等价表达式)
题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...
- 剑指offer重构二叉树 给出二叉树的前序和后序重构二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. 假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4, ...
- 笔试算法题(36):寻找一棵二叉树中最远节点的距离 & 根据二叉树的前序和后序遍历重建二叉树
出题:求二叉树中距离最远的两个节点之间的距离,此处的距离定义为节点之间相隔的边数: 分析: 最远距离maxDis可能并不经过树的root节点,而树中的每一个节点都可能成为最远距离经过的子树的根节点:所 ...
- URAL 1136 Parliament 二叉树水题 BST后序遍历建树
二叉树水题,特别是昨天刚做完二叉树用中序后序建树,现在来做这个很快的. 跟昨天那题差不多,BST后序遍历的特型,找到最后那个数就是根,向前找,比它小的那块就是他的左儿子,比它大的那块就是右儿子,然后递 ...
- 1058FBI<二叉树,递归,后序遍历>
问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...
- Binary Tree Traversal 二叉树的前中后序遍历
[抄题]:二叉树前序遍历 [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...
随机推荐
- 对MySQL索引、锁及事务的简单分析
一.索引的数据结构 1.二叉搜索树实现的索引 二叉搜索树如下图,它查找元素的时间复杂度为O(logn) 但如果经常出现增删操作,最后导致二叉搜索树变成线性的二叉树,这样它查找元素的时间复杂度就会变成O ...
- Tomcat项目自动部署脚本
一般情况下使用的Linux环境都是加固的,root路径只有超级管理员权限才能进入.我们新建一个自己的用户,在/home下会有一个用户目录,传输war包都放在这个目录下,此时不动webapps文件下的内 ...
- 第十五章、Python多线程同步锁,死锁和递归锁
目录 第十五章.Python多线程同步锁,死锁和递归锁 1. 引子: 2.同步锁 3.死锁 引子: 4.递归锁RLock 原理: 不多说,放代码 总结: 5. 大总结 第十五章.Python多线程同步 ...
- python函数:函数阶段练习
1.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改的操作def modify_file(filename,old,new): import os with open(filena ...
- Tunnel Warfare HDU - 1540 (线段树处理连续区间问题)
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...
- D - A or...or B Problem
题意:给定A,B,问[A,B]里取任意个数按位或,结果有多少种. 思路:这题需要找出一个分界点,即找到最高位的B是1,A是0的位置x(最低位从0开始),那么对于所有OR的结果,x处要么是1要么是0,x ...
- 关于GRPC的讲解
gRPC服务发现&负载均衡 https://segmentfault.com/a/1190000008672912?utm_source=tag-newest GRPC编程指南 gRPC 介绍 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 (后缀数组/二分+Hash)
跟BZOJ 4278: [ONTAK2015]Tasowanie一模一样 SA的做法就是把原串倒过来接在原串后面,O(nlogn)O(nlogn)O(nlogn)做后缀数组,就能O(1)O(1)O(1 ...
- @SpringQueryMap注解 feign的get传参方式(转)
spring cloud项目使用feign的时候都会发现一个问题,就是get方式无法解析对象参数.其实feign是支持对象传递的,但是得是Map形式,而且不能为空,与spring在机制上不兼容,因此无 ...
- 多个linux主机利用samba服务实现共享文件
工具:两台centos7虚拟机(其他版本也都支持) 安装包:samba(还有其他依赖包) samba-client 首先实现samba服务器配置 1.先安装samba包,系统自动会下载其他依赖包 2. ...