Java实现表达式二叉树_java

什么是二叉树,这里不再介绍,可以自行百度:二叉树。在这里利用java实现“表达式二叉树”。 

表达式二叉树的定义 

第一步先要搞懂表达式二叉树是个什么东东?举个栗子,表达式:(a+b×(c-d))-e/f。将数字放在叶子节点,将操作符放在分支节点,就构成了一个二叉树,由于存储的是一个表达式,称之为“表达式二叉树”。

童靴们可能好奇这个到底是怎么构建的?就拿45+23*56/2-5来说吧。首先取出第一个数字45放在叶子节点,遇到“+”后将其放到分支节点,

然后将“23”、“*”、“56”、“/”、“2”依次放入,

最后放入“-”、“5”,

大致就是这样。(这些图我自己画的,比较丑,大家看看就好(⊙﹏⊙))

表达式二叉树的构建步骤
1.创建节点对象; 
2.辨析出操作符与数据,存放在相应的列表(队列)中; 
3.取出前两个数字和一个操作符,组成一个新的数字节点; 
4.重复第3步,直到操作符取完为止; 
5.让根节点等于最后一个节点。  

 表达式二叉树的实现
 首先构建节点对象类,包括数据,左子树,右子树和几个set、get方法。 

package tets0714;
/**
 * 结点对象类
 * @author yuxiu
 *
 */
public class Node {
  // 数据
  private String data;
  // 左子树
  private Node lchild;
  // 右子树
  private Node rchild;

  Node() {
  }

  Node(String data) {
    this.data = data;
  }

  Node(String data, Node lchild, Node rchild) {
    super();
    this.data = data;
    this.lchild = lchild;
    this.rchild = rchild;

  }
  public String getData() {
    return data;
  }
  public Node getLchild() {
    return lchild;
  }
  public Node getRchild() {
    return rchild;
  }

}

接着就是构建表达式二叉树了。 

package tets0714;

import java.util.ArrayList;

/**
 * 表达式二叉树类
 * @author yuxiu
 *
 */
public class Formaluetree {
  private String s="";
  private Node root;   //根节点
  /**
   * 创建表达式二叉树
   * @param str  表达式
   */
  public void creatTree(String str){
    //声明一个数组列表,存放的操作符,加减乘除
    ArrayList<String> operList = new ArrayList<String>();
    //声明一个数组列表,存放节点的数据
    ArrayList<Node> numList = new ArrayList<Node>();
    //第一,辨析出操作符与数据,存放在相应的列表中
    for(int i=0;i<str.length();i++){
      char ch = str.charAt(i);     //取出字符串的各个字符
      if(ch>='0'&&ch<='9'){
        s+=ch;
      }else{
        numList.add(new Node(s));
        s="";
        operList.add(ch+"");

      }

    }
    //把最后的数字加入到数字节点中
    numList.add(new Node(s));

    while(operList.size()>0){  //第三步,重复第二步,直到操作符取完为止
      //第二,取出前两个数字和一个操作符,组成一个新的数字节点
      Node left = numList.remove(0);
      Node right = numList.remove(0);
      String oper = operList.remove(0);

      Node node = new Node(oper,left,right);
      numList.add(0,node);    //将新生的节点作为第一个节点,同时以前index=0的节点变为index=1

    }
    //第四步,让根节点等于最后一个节点
    root = numList.get(0);

  }
  /**
   * 输出结点数据
   */
  public void output(){
      output(root);   //从根节点开始遍历
  }
  /**
   * 输出结点数据
   * @param node
   */
  public void output(Node node){
    if(node.getLchild()!=null){    //如果是叶子节点就会终止
      output(node.getLchild());
    }
    System.out.print(node.getData());   //遍历包括先序遍历(根左右)、中序遍历(左根右)、后序遍历(左右根)
    if(node.getRchild()!=null){
      output(node.getRchild());
    }

  }

  public static void main(String[] args) {
    Formaluetree tree = new Formaluetree();
    tree.creatTree("45+23*56/2-5");//创建表达式的二叉树
    tree.output();//输出验证

  }

}

最后在控制台可以输出“45+23*56/2-5”,OK了。这里使用的中序遍历,小伙伴们可以试试采用先序遍历、后序遍历是什么效果。至于遍历,我们后面再讲。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java表达式二叉树
java二叉树
java 二叉树 实现、java实现二叉树遍历、java二叉树的实现、二叉树 java 代码实现、java实现平衡二叉树,以便于您获取更多的相关知识。

时间: 2024-10-28 16:21:22

Java实现表达式二叉树_java的相关文章

Java Lambda 表达式详解及示例代码_java

Java Lambda 表达式是 Java 8 引入的一个新的功能,可以说是模拟函数式编程的一个语法糖,类似于 Javascript 中的闭包,但又有些不同,主要目的是提供一个函数化的语法来简化我们的编码. Lambda 基本语法 Lambda 的基本结构为 (arguments) -> body,有如下几种情况: 参数类型可推导时,不需要指定类型,如 (a) -> System.out.println(a) 当只有一个参数且类型可推导时,不强制写 (), 如 a -> System.o

java创建递归二叉树,输出根数据时出现空指针异常

问题描述 java创建递归二叉树,输出根数据时出现空指针异常 代码如下:import java.io.File;import java.io.FileNotFoundException;import java.util.LinkedList;import java.util.Scanner;import java.util.*;class BiNode{ public String data; public BiNode lchild; public BiNode rchild; public

Java Lambda表达式初探

前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用JDK7.对企业来说,技术上谨慎未必是坏事,但对个人学习而言,不去学习新技术就很可能被技术抛弃.Java 8一个重要的变更是引入Lambda表达式(lambda expression),这听起来似乎很牛,有种我虽然不知道Lambda表达式是什么,但我仍然觉得很厉害的感觉.不要怕,具体到语言层面上Lambda表达式不过是一种新的语法而

c-关于java赋值表达式的优先级的问题

问题描述 关于java赋值表达式的优先级的问题 刚学java,现遇到这个问题,若有定义int a=2,则执行完语句a+=a-=a*a;后a的值是多少.按以往c语言的语法应该为-4 而现在为什么java运行后值是0呢? 解决方案 java和c的运算规则不一样,例如下面这段代码在Java总运行时 1. long a = 2,b = 9; 2. a += b -= a*a;//a = 7,b=5,与C一致 3. a = 2; 4. a += a-= a*a;// 在Java中赋值顺序为从左到右,a*a

一种新的攻击方法——Java Web表达式注入

0×00 引言在2014年6月18日@终极修炼师曾发布这样一条微博:498)this.width=498;' onmousewheel = 'javascript:return big(this)' style="width: 477px; height: 446px" border="0" alt="新攻击方法--Java Web Expression Language Injection" src="http://s5.51cto.

c++-我写的建立表达式二叉树的一个函数,delete[]p和B.pop(a1)出错,不明白为什么

问题描述 我写的建立表达式二叉树的一个函数,delete[]p和B.pop(a1)出错,不明白为什么 BinaryTree::BinaryTree(string A){ arrStack B(NUM); BinaryTreeNode a1(" "), a2(" "); int i = 0; while (A[i] != '='){ char *p = new char[]; char *q = p; int j = 0; if ((int)A[i] >= 48

通过实例深入学习Java的Struts框架中的OGNL表达式使用_java

Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势: 1. 支持对象方法调用,如xxx.doSomeSpecial(): 2. 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME: 3. 支持赋值操作和表达式串联,如price=100, discount=0.8, cal

Java实现求二叉树的深度和宽度_java

这个是常见的对二叉树的操作.总结一下: 设节点的数据结构,如下: 复制代码 代码如下: class TreeNode {     char val;     TreeNode left = null;     TreeNode right = null;     TreeNode(char _val) {         this.val = _val;     } } 1.二叉树深度 这个可以使用递归,分别求出左子树的深度.右子树的深度,两个深度的较大值+1即可. 复制代码 代码如下: //

java ee-EL表达式中对pageContext隐含对象

问题描述 EL表达式中对pageContext隐含对象 这个pageContext对象是不是等于就是JSP里的.不清楚地方是通过pageContext访问的其他8个JSP内置对象 ,调用的方法怎么和servelt中不一样呢.例如${pageContext.request.queryString} queryString方法 就是HttpServletRequest.getQueryString(), JSP里内置对象的方法还是和对应Servlet的一模一样. 只是在EL中都如此去掉了get对吗?