java 二叉树(十二)二叉树计算表达式

实现原理:把得到的逆波兰式进行逐个压入栈中,如:ab+c*ab+e/- 首先把a当作一个节点压入栈S中,然后继续吧b压入栈S中,当遇到+时,先把b弹出作为+的右孩子,把弹出作为+的左孩子。然后把+作为ab的根节点,这样就形成了一颗树。然后把+压入栈S中,依次重复向S1中压入即可。

最后把得到的二叉树进行后序遍历计算,后序遍历的时候每遇到一个操作符就把操作符的左孩子和右孩子进行相应的操作即可。

下面给出一种算法来把后缀表达式转变成表达式树。我们一次一个符号地读入表达式。如果符号是操作数,那么就建立一个单结点树并将它推入栈中。如果符号是操作符,那么就从栈中弹出两棵树T1T2(T1先弹出)并形成一棵新的树,该树的根就是操作符,它的左、右儿子分别是T2T1。然后将指向这颗树的指针压入栈中。

下图和讲解引用:http://blog.chinaunix.net/uid-26833883-id-3169349.html

    下面来看一个例子。设输入为ab+cde+**

前两个符号是操作数,因此创建两棵单结点树并将指向它们的指针压入栈中。

java 二叉树(十二)二叉树计算表达式_第1张图片

接着,"+"被读入,因此指向两棵树的指针被弹出,形成一棵新的树,并将指向它的指针压入栈中。

java 二叉树(十二)二叉树计算表达式_第2张图片


然后,c,d和e被读入,在单个结点树创建后,指向对应的树的指针被压入栈中。


java 二叉树(十二)二叉树计算表达式_第3张图片


接下来读入"+"号,因此两棵树合并。


java 二叉树(十二)二叉树计算表达式_第4张图片


继续进行,读入"*"号,因此,弹出两棵树的指针合并形成一棵新的树,"*"号是它的根。


java 二叉树(十二)二叉树计算表达式_第5张图片


最后,读入一个符号,两棵树合并,而指向最后的树的指针被留在栈中。


java 二叉树(十二)二叉树计算表达式_第6张图片

这里有用到上一节说的得到逆波兰序列的栈。

栈(链表实现)的设计和树的设计公用一个节点类:

节点类:


class Node1{
	public String data;
	public Node1 lChild;
	public Node1 rChild;
	public Node1 front;
	public Node1 next;
	public Node1(String data){
		this.data=data;
		this.lChild=null;
		this.rChild=null;
	}
	public void setFront(Node1 node){
		this.front=node;
	}
	public Node1 grtFront(){
		return front;
	}
	public void setNext(Node1 node){
		this.next=node;
	}
	public Node1 getNext(){
		return next;
	}
	public void setLChild(Node1 lChild){
		this.lChild=lChild;
	}
	public Node1 getLChild(){
		return lChild;
	}
	public void setRChild(Node1 rChild){
		this.rChild=rChild;
	}
	public Node1 getRChild(){
		return rChild;
	}
}

链表类:
package 二叉树结算器;



public class LinkTree {
	public Node1 head;
	public void addnode(Node1 node){			
			if(head==null){
				head=node;
			}else{
				head.setFront(node);
				node.setNext(head);
				head=node;
				head.setFront(null);
			}
		
	}
	public Node1 delNode(){
		Node1 node=head;
		head=head.getNext();
		if(head!=null){			
		head.setFront(null);
		node.setNext(null);
		}
		return node;
	}
	public void clear(){
		while(head!=null){
			head=head.getNext();
			head=null;
		}
	}
}


树类:
package 二叉树结算器;



public class Tree {
	LinkTree lt = new LinkTree();
	public RPN rpn = new RPN();
	//public String str;//="(1+2)*3-(1+2)/4";
	
	//String st = rpn.rpn(str).pop();
	public Stack st = new Stack();
	
	public Node1 root;
	public Stack sss;
	public Tree(String str){
		root=null;
		sss=rpn.rpn(str);
		
		
	}
	public boolean isEmpty(){
		if(root==null){
			return true;
		}
		return false;
	}
	public void addTree(){
		sss.str_print();
		int m=-1;
		while(m

测试类:
package 二叉树结算器;

import java.util.Scanner;

public class Test {
	public static void main(String args[]){
		System.out.println("请输入多项式:");
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();
		Tree tree = new Tree(str);
		tree.addTree();
		tree.postOrder(tree.root);
		
		System.out.println(str+"=  "+tree.postOrder1(tree.root));
		
		scan.close();
		
	}



你可能感兴趣的:(Java,数据结构,二叉树,栈,逆波兰序列,算法,链表)