您的位置:首页 > 其它

UVa 112 - Tree Summing

2013-05-25 22:51 507 查看
/*
* UVa 112 - Tree Summing
* */

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.LinkedList;

//方法一:用栈
class TreeSuming {
public static void main(String[] args) throws IOException {
int num = 0;
int count = 0;
int sum = 0;
int c;
int data;
LinkedList<String> stack = new LinkedList<String>();
StreamTokenizer in = new StreamTokenizer(new InputStreamReader(
System.in));
boolean flag = false;

while ((c = in.nextToken()) != StreamTokenizer.TT_EOF) {
if (stack.size() == 0) {
num = ((int) in.nval);// 读取给定路径值
c = in.nextToken();
}
if (c == StreamTokenizer.TT_NUMBER) {// 节点值
data = (int) in.nval;
sum += data;
stack.push(data + "");
count = 0;
}
if (c != StreamTokenizer.TT_NUMBER) {// 左右括号
if ((char) c == '(') {
stack.push("(");
} else if ((char) c == ')') {
if (stack.getFirst() == "(") {// 出栈
count++;
stack.pop();
if (count == 2) {// 叶节点
if (sum == num) {
flag = true;
}
count = 0;
}
} else {// 返回父节点
sum -= Integer.parseInt(stack.pop());
stack.pop();// 左括号出栈
count = 0;
}
}
}
if (stack.size() == 0) {
if (flag) {
System.out.println("yes");

} else {
System.out.println("no");
}
sum = 0;
flag = false;
count = 0;
}
}
}
}

// 方法二:递归
class Main {
int num = 0;
int sum = 0;
int c;
StreamTokenizer in = new StreamTokenizer(new InputStreamReader(System.in));
boolean found = false;

public static void main(String[] args) throws Exception {
Main m = new Main();
while ((m.c = m.in.nextToken()) != StreamTokenizer.TT_EOF) {
m.sum = 0;
m.found = false;
m.num = (int) m.in.nval;
m.get_tree(m);
if (m.found) {
System.out.println("yes");
} else {
System.out.println("no");
}
}
}

// 返回false:空树
private boolean get_tree(Main m) throws Exception {
m.c = m.in.nextToken();// 读取"("
m.c = m.in.nextToken();
if (m.c != StreamTokenizer.TT_NUMBER) {// "("后面不是数字 空树
return false;
}
int num = (int) m.in.nval;
if (m.c == StreamTokenizer.TT_NUMBER) {
m.sum += num;
}
boolean left = get_tree(m);// 递归遍历左子树
boolean right = get_tree(m);// 递归遍历右子树
if (!left && !right && m.sum == m.num) {// 叶子节点,找到路径
m.found = true;
}
m.in.nextToken();// 读取")"
m.sum -= num;
return true;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: