概述

表达式树的特点:叶节点是操作数,其他节点为操作符。
由于一般的操作符都是二元的,所以表达式树一般都是二叉树。


根据后缀表达式"ab+cde+**"建立一颗树

文字描述:

如同后缀表达式求值一样,逐个读取后缀表达式的每一个符号,
如果遇到操作数,建立一个节点把操作数的值加入这个节点,并把节点入栈;
如果遇到操作符,弹出栈里的两个节点,并赋值为自己的左子节点、右子节点,最后把这个节点树入栈。

画图描述:

1、读入操作数a,创建节点,压入栈;读入操作数b,创建节点,压入栈

2、遇到操作符“+”,弹出栈内的两个节点;创建一个新节点;把“+”赋值给新节点,新节点的左节点、右节点分别赋值为刚弹出的两个节点;新节点入栈

3、读入操作数c,创建节点,压入栈……

4、遇到操作符“+”,弹出栈内的两个节点;创建一个新节点;把“+”赋值给新节点,新节点的左节点、右节点分别赋值为刚弹出的两个节点;新节点入栈(和第2步相同)

5、遇到操作符“*”,弹出栈内的两个节点;创建一个新节点;把“*”赋值给新节点,新节点的左节点、右节点分别赋值为刚弹出的两个节点;新节点入栈(和第2步相同)

6、好了

代码实现:

import java.util.Stack;

public class Test {
// 前缀表达式 +ab**+cde
// 中缀表达式 (a+b)*((c+d)*e)
// 后缀表达式
static String expression = "ab+cde+**";
static Stack stack = new Stack();
public static void main(String[] args) {
Tree tree = createTree(expression);
// 后序遍历输出树
travTree(tree.root);
}
private static void travTree(Node node) {
Node currentNode = node;
if (currentNode != null) {
travTree(currentNode.leftChild);
travTree(currentNode.rightChild);
System.out.print(node.element);
}
}
// 把后缀表达式转化为一颗树
private static Tree createTree(String expression) {
for (int i = 0; i < expression.length(); i++) {
char ch = expression.charAt(i);
if (ch != '+' && ch != '-' && ch != '*' && ch != '/') {
Node node = new Node(ch);
stack.push(node);
} else {
Node node = new Node(ch);
Node rightNode = (Node)stack.pop();
Node leftNode = (Node)stack.pop();
node.setLeftChild(leftNode);
node.setRightChild(rightNode);
stack.push(node);
}
}
return new Tree((Node) stack.pop());
}
}
class Node {
char element;
Node leftChild;
Node rightChild;
Node(char element) {
this.element = element;
}
void setLeftChild(Node leftChild) { this.leftChild = leftChild; }
void setRightChild(Node rightChild) { this.rightChild = rightChild; }
}
class Tree {
Node root;
Tree(Node root) { this.root = root;}
}

Java实现后缀表达式建立表达式树的更多相关文章

  1. ACM:树的变换,依据表达式建立表达式树

    题目:输入一个表达式.建立一个表达式树. 分析:找到最后计算的运算符(它是整棵表达式树的根),然后递归处理!             在代码中.仅仅有当p==0的时候.才考虑这个运算符,由于括号中的运 ...

  2. C++ — 后缀表达式转表达式树

    2018-07-21 16:57:26 update 建立表达式树的基本思路:方法类似由下而上建立堆的思想,所以时间复杂度为O(n),这样算法就会变得很简单,只用考虑处理需要入栈的节点和栈中的节点即可 ...

  3. C#中的Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

  4. Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

  5. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  6. [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用

    [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用 本节导读:讨论了表达式树的定义和解析之后,我们知道了表达式树就是并非可执行代码,而是将表达式对象化后的数据结构.是 ...

  7. Java核心技术-接口、lambda表达式与内部类

    本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内 ...

  8. [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门

    [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习 ...

  9. 16.C#初见Lambda表达式及表达式树(九章9.1-9.3)

    在说明Lambda相关知识前,我们需要了解Lambda表达式常用于LINQ,那么我们来聊下LINQ. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑: ...

随机推荐

  1. shell信号捕捉命令 trap

    trap 命令 tarp命令用于在接收到指定信号后要执行的动作,通常用途是在shell脚本被中断时完成清理工作.例如: 脚本在执行时按下CTRL+c时,将显示"program exit... ...

  2. 自定义 Scrapy 爬虫请求的 URL

    之前使用 scrapy 抓取数据的时候 ,默认是在逻辑中判断是否执行下一次请求 def parse(self): # 获取所有的url,例如获取到urls中 for url in urls: yiel ...

  3. JS获取当前时间和日期

    当前时间和日期 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1 ...

  4. php 获取请求参数

    $value = $_POST["value"];//取得post中的 $value=$_REQUEST["value"];//取得get或者post中的参数( ...

  5. es-03-DSL的简单使用

    以下操作在kibana中进行, 如果在linux的shell中, 请使用 curl -Xget 'http://node1:9200/index/type/id' -d '{ ... }' 的形式, ...

  6. B+树原理及mysql的索引分析

    转自:http://blog.csdn.net/qq_23217629/article/details/52512041 B+/-Tree原理 B-Tree介绍 B-Tree是一种多路搜索树(并不是二 ...

  7. eclipse使用tomcat:run启动项目时修改默认端口

    命令:-Dmaven.tomcat.port=8081 tomcat:run

  8. python 详解正则表达式的使用(re模块)

    一,什么是正则表达式 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件 ...

  9. Android studio的gradle

    1. gradle的基本概念 gradle构建* Android Studio使用`Gradle`构建工具,Eclipse的ADT插件使用的是`Ant`构建工具* 构建:生成app的过程,执行一些的命 ...

  10. Python时间系统

    Python的time和datetime模块提供了时间日期工具, python中的时间有4种表示方式: datetime obj time obj/tuple posix timestamp time ...