[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).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...
随机推荐
- centos8/redhat8 无法上网,通过启动systemctl start NetworkManger搞定
在systemd里面,可以直接使用systemctl进行管理 启动:systemctl start NetworkManger 关闭:systemctl stop NetworkManager 开机启 ...
- Bootstrap常用的自带插件
Bootstrap自带的那些常用插件. 模态框 模态框的HTML代码放置的位置 务必将模态框的HTML代码放在文档的最高层级内(也就是说,尽量作为 body 标签的直接子元素),以避免其他组件影响模态 ...
- kill命令和killall命令
kill命令用于终止指定的进程(terminate a process),是Unix/Linux下进程管理的常用命令.通常,我们在需要终止某个或某些进程时,先使用ps/pidof/pstree/top ...
- C++面试高频题
作者:守望者1028链接:https://www.nowcoder.com/discuss/55353来源:牛客网 面试高频题: 校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我也忘记了 ...
- vmware 兼容问题
1.出现此问题的原因是Device Guard或Credential Guard与Workstation不兼容.2.Windows系统的Hyper-V不兼容导致.解决方法: 步骤一:禁用Device ...
- Beta冲刺版本第一天
该作业所属课程:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业要求地址:https://edu.cnblogs.com ...
- NLP/CL 顶会收录
全文转载自知乎@刘知远老师:初学者如何查阅自然语言处理学术资料(2016修订版). 1. 国际学术组织.学术会议与学术论文 自然语言处理(natural language processing,NLP ...
- php将数组中某个元素置顶设为第一个元素
一个数组$a0有N个元素,要将其中第3个元素,排在数组的首位. 第一种做法是: 取出第3个元素,赋值给变量$a unset 第3个元素 array_unshift 将$a添加到数组头部. 如果是数字下 ...
- zencart加大数据表字段长度
批量表产品名称过长导致被截断的情况,是由于产品名称超出了数据库表中字段设置的最大长度,下面通过修改数据库表字段长度来避免此类情况发生: ) ; ) ; ) ; ) ; ) ; ) ; ) ; ) ; ...
- java WebSocket HTML页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...