- 波兰式是在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之前,所以这种表示法也称为前缀表达式。例如: (2 + 4) * 6的波兰式为 *+246
- 逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),将运算符写在操作数之后,也叫后缀表达式。例如:(2 + 4) * 6的逆波兰式为 24+6*
- 算法实现(java):
- 构建波兰式二叉树
- 后续遍历二叉树生成逆波兰式
- 输入时每次接受一个运算符或操作数
public class Test {
public static void main(String[] args){
System.out.println("Build PN tree:");
Node tree = buildTree();
System.out.println("\npreOrderTraverse:");
preOrderTraverse(tree);
System.out.println("\ninOrderTraverse:");
inOrderTraverse(tree);
System.out.println("\npostOrderTraverse:");
postOrderTraverse(tree);
}
static class Node{
String value;
Node left;
Node right;
}
static Node buildTree(){
Scanner input = new Scanner(System.in);
String exp = input.next();
Node node = new Node();
node.value = exp;
if(exp.equals("+") || exp.equals("-") || exp.equals("*") || exp.equals("/")){
node.left = buildTree();
node.right = buildTree();
}
return node;
}
public static void preOrderTraverse(Node tree){
if(tree == null){
return;
}
System.out.print(tree.value);
preOrderTraverse(tree.left);
preOrderTraverse(tree.right);
}
public static void inOrderTraverse(Node tree){
if(tree == null){
return;
}
if(tree.left != null){
System.out.print("(");
}
inOrderTraverse(tree.left);
System.out.print(tree.value);
inOrderTraverse(tree.right);
if(tree.right != null){
System.out.print(")");
}
}
public static void postOrderTraverse(Node tree){
if(tree == null){
return;
}
postOrderTraverse(tree.left);
postOrderTraverse(tree.right);
System.out.print(tree.value);
}
}