//输入一个二叉树和一个整数,打印出二叉树中节点值的和等于输入整数所有的路径
public void findAllPath(Node node,int K){
if (node==null) {
return;
}
Stack<Integer> path=new Stack<>();//记录路径值
find(node, K, 0, path);
}
void find(Node node,int K,int curSum,Stack<Integer> path) {
if (node==null) {
return;
}
curSum+=node.value;
path.push(node.value);
if (K==curSum) {
for (Integer integer : path) {
System.out.print(integer+" ");
System.out.println();
}
}
find(node.left, K, curSum, path);
find(node.right, K, curSum, path);
path.pop();
}
//输入一个二叉树和一个整数,打印出二叉树中节点值的和等于输入整数最大路径长度
public int findMaxLength(Node node,int K) {
// key={curSum,当前层的所有和},value={level 当前的层数}
HashMap<Integer, Integer> sumMap=new HashMap<>();
sumMap.put(0, 0);//最开始的时候,累加和为0 ,不包括任何节点
return preOrder(node,K,0,1,0,sumMap);//先序遍历
}
/**
*
* @param node 当前节点
* @param sum 给定数字
* @param preSum 上一节点的所有和
* @param level 当前节点的层数
* @param maxLenth 满足条件最大长度
* @param sumMap {key=[curSum,当前层的所有和],value=[level 当前的层数]}
* @return 满足条件最大长度
*/
private int preOrder(Node node, int sum, int preSum, int level, int maxLenth, HashMap<Integer, Integer> sumMap) {
if (node==null) {
return maxLenth;
}
int curSum=preSum+node.value;
if (!sumMap.containsKey(curSum)) {
sumMap.put(curSum, level);
}
if (sumMap.containsKey(curSum-sum)) {
Math.max(level-sumMap.get(curSum-sum),maxLenth);
}
maxLenth=preOrder(node.left, sum, curSum, level+1, maxLenth, sumMap);
maxLenth=preOrder(node.right, sum, curSum, level+1, maxLenth, sumMap);
if (level==sumMap.get(curSum)) {
sumMap.remove(curSum);
}
return maxLenth;
}