import java.util.*; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); long expectedSum = 0; boolean gotSum = false; while (cin.hasNext() && !gotSum) { String firstLine = cin.nextLine(); if (firstLine == null || firstLine.isEmpty()) { continue; } if (firstLine.trim().isEmpty()) { continue; } try { expectedSum = Long.parseLong(firstLine); gotSum = true; break; } catch (Exception e) { continue; } } TreeNode treeRoot = null; boolean gotNodes = false; while (cin.hasNext() && !gotNodes) { String nodeLine = cin.nextLine(); if (nodeLine == null || nodeLine.isEmpty()) { continue; } if (nodeLine.trim().isEmpty()) { continue; } try { String nodeStrings[] = nodeLine.split(","); treeRoot = createTree(nodeStrings); gotNodes = true; break; } catch (Exception e) { continue; } } List<Stack<TraceStep>> traces = findTrace(treeRoot, expectedSum); // if (traces.isEmpty()) { System.out.println("error"); return; } for (Stack<TraceStep> trace : traces) { StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < trace.size() - 1; i++) { stringBuffer.append(trace.get(i).getNode().getValue()).append(‘,‘); } stringBuffer.append(trace.pop()); System.out.println(stringBuffer.toString()); } } private static TreeNode createTree(String nodeStrings[]) { TreeNode root = new TreeNode(Long.parseLong(nodeStrings[0])); if (nodeStrings.length > 1) { addChildRen(new TreeNode[]{root}, Arrays.copyOfRange(nodeStrings, 1, nodeStrings.length)); } return root; } private static void addChildRen(TreeNode[] leafs, String nodeStrings[]) { if (nodeStrings.length > leafs.length * 2) { TreeNode[] newLeafs = new TreeNode[leafs.length * 2]; for (int i = 0; i < newLeafs.length; i++) { newLeafs[i] = new TreeNode(Long.parseLong(nodeStrings[i])); } for (int i = 0; i < newLeafs.length; i++) { if (i % 2 == 0) { leafs[i / 2].setLeft(newLeafs[i]); } if (i % 2 == 1) { leafs[i / 2].setRight(newLeafs[i]); } } addChildRen(newLeafs, Arrays.copyOfRange(nodeStrings, newLeafs.length, nodeStrings.length)); } else { TreeNode[] newLeafs = new TreeNode[nodeStrings.length]; for (int i = 0; i < newLeafs.length; i++) { newLeafs[i] = new TreeNode(Long.parseLong(nodeStrings[i])); } for (int i = 0; i < newLeafs.length; i++) { if (i % 2 == 0) { leafs[i / 2].setLeft(newLeafs[i]); } if (i % 2 == 1) { leafs[i / 2].setRight(newLeafs[i]); } } } } public static List<Stack<TraceStep>> findTrace(TreeNode treeRoot, long sumExpected) { List<Stack<TraceStep>> allTraces = new ArrayList<Stack<TraceStep>>(); Stack<TraceStep> trace = new Stack<TraceStep>(); TraceStep current = new TraceStep(treeRoot); trace.add(current); while (!trace.isEmpty()) { if (!current.isLeftVisited()) { current.setLeftVisited(true); if (current.getNode().getLeft() != null) { trace.add(new TraceStep(current.getNode().getLeft())); current = trace.peek(); } } else if (!current.isRightVisited()) { current.setRightVisited(true); if (current.getNode().getRight() != null) { trace.add(new TraceStep(current.getNode().getRight())); current = trace.peek(); } } else { if ((current.getNode().getLeft() == null) && (current.getNode().getRight() == null)) { if (sum(trace) == sumExpected) { allTraces.add(copy(trace)); } } trace.pop(); if (!trace.isEmpty()) { current = trace.peek(); } } } return allTraces; } private static Stack<TraceStep> copy(Stack<TraceStep> trace) { Stack<TraceStep> aCopy = new Stack<TraceStep>(); for (TraceStep traceStep : trace) { aCopy.add(new TraceStep(traceStep)); } return aCopy; } private static long sum(Stack<TraceStep> trace) { long result = 0; for (TraceStep traceStep : trace) { result += traceStep.getNode().getValue(); } return result; } static class TreeNode { public TreeNode(long v) { this.value = v; } private long value; private TreeNode left; private TreeNode right; public long getValue() { return value; } public void setValue(long value) { this.value = value; } public TreeNode getLeft() { return left; } public void setLeft(TreeNode left) { this.left = left; } public TreeNode getRight() { return right; } public void setRight(TreeNode right) { this.right = right; } } static class TraceStep { public TraceStep(TraceStep other) { this(other.getNode()); this.leftVisited = other.leftVisited; this.rightVisited = other.rightVisited; } public String toString() { return "" + this.getNode().getValue(); } ; private TreeNode node; private boolean leftVisited; private boolean rightVisited; public TreeNode getNode() { return node; } public boolean isLeftVisited() { return leftVisited; } public void setLeftVisited(boolean leftVisited) { this.leftVisited = leftVisited; } public boolean isRightVisited() { return rightVisited; } public void setRightVisited(boolean rightVisited) { this.rightVisited = rightVisited; } TraceStep(TreeNode node) { this.node = node; } } }
原文:http://www.cnblogs.com/easyroom/p/6390022.html