题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
输入:
每个测试案例包括n+1行:
第一行为2个整数n,k(1<=n<=10000),n表示结点的个数,k表示要求的路径和,结点编号从1到n。
接下来有n行。这n行中每行为3个整数vi,leftnode,rightnode,vi表示第i个结点的值,leftnode表示第i个结点的左孩子结点编号,rightnode表示第i个结点的右孩子结点编号,若无结点值为-1。编号为1的结点为根结点。
输出:
对应每个测试案例,先输出“result:”占一行,接下来按字典顺序输出满足条件的所有路径,这些路径由结点编号组成,输出格式参照输出样例。
代码:
package JvavaDataTest;
import java.util.LinkedList;
import java.util.List;
public class FindPathTest {
public static void main(String[] args) {
Node root = new Node(8);
Node node8 = new Node(8);
Node node7 = new Node(7);
root.left = node8;
root.right = node7;
Node node9 = new Node(9);
node8.left = node9;
Node node2 = new Node(2);
node8.right = node2;
Node node4 = new Node(4);
Node node72 = new Node(7);
node2.left = node4;
node2.right = node72;
findpath(root,15);
}
public static void findpath(Node root,int expect){
if(root == null){
return;
}
List<Node> path = new LinkedList<Node>();
int currentSum = 0;
findPath(root, expect, path, currentSum);
}
private static void findPath(Node node,int expect,List<Node> path,int currentSum){
currentSum += node.key;
path.add(node);
if(node.left == null && node.right == null && currentSum == expect){
System.out.println("路径已经找到");
for(Node n : path){
System.out.print(n.key +" ");
}
System.out.println("");
}
if(node.left != null){
findPath(node.left,expect,path,currentSum);
}
if(node.right != null){
findPath(node.right,expect,path,currentSum);
}
path.remove(path.size()-1);
}
}
class Node{
int key;
Node left;
Node right;
Node(int key){
this.key = key;
}
}
结果: