路径为从根节点到叶节点一条路径,路径经过的各节点数值之和等于某一给定数值,则打印路径上的节点
- 因为需要打印满足条件的路径节点信息和各节点之和,需要栈记录经过的节点,和一个保存数值之和的变量
- 用前序遍历方法,可以首先访问节点,然后将节点入栈,并将数值和之前入栈的节点值相加
- 如果当前之和否满足给定值,判断当前节点是否叶节点,是则打印路径信息
- 判断节点左右孩子是否为空,递归调用
- 在调用完,返回时要将入栈的值出栈(此时栈中节点只到父节点),和变量也要变回调用之前的状态
【代码】
//二叉树定义
class Btree {
int value;
Btree leftBtree;
Btree rightBtree;
}
private Stack<Integer> stack = new Stack<Integer>();
public void FindPath(Btree node , int sum,int currSum){
boolean isLeaf;
if(node == null)
return;
currSum += node.value;
stack.push(node.value);
isLeaf = node.leftBtree == null && node.rightBtree == null;
if(currSum == sum && isLeaf){
System.out.println("Path:");
for(int val : stack){
System.out.println(val);
}
}
if(node.leftBtree != null)
FindPath(node.leftBtree, sum, currSum);
if(node.rightBtree != null)
FindPath(node.rightBtree, sum, currSum);
currSum -= node.value;
stack.pop();
}
import java.util.ArrayList;
import java.util.Stack;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,
int target) {
ArrayList<ArrayList<Integer>> pathList=
new ArrayList<ArrayList<Integer>>();
if(root==null)
return pathList;
Stack<Integer> stack=new Stack<Integer>();
FindPath(root,target,stack,pathList );
return pathList;
}
private void FindPath(TreeNode root, int target,
Stack<Integer> path,
ArrayList<ArrayList<Integer>> pathList) {
if(root==null)
return;
if(root.left==null&&root.right==null){
if(root.val==target){
ArrayList<Integer> list=
new ArrayList<Integer>();
for(int i:path){
list.add(new Integer(i));
}
list.add(new Integer(root.val));
pathList.add(list);
}
}
else{
path.push(new Integer(root.val));
FindPath(root.left, target-root.val, path, pathList);
FindPath(root.right, target-root.val, path, pathList);
path.pop();
}
}
}