输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的所有的结点形成一条路径。
采用前序遍历,这样可以先访问根节点。
有如下树
5
3 7
2 4
路径之和为12的有5->3->4和5->7,但是首先会存在5->3->2,不满足时,要回退到5->3,所以选择栈来保存路径信息
代码
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
public static void findAllPathes(TreeNode root, int expectedSum) {
if (root == null) {
return;
}
Stack<Integer> path = new Stack<>();
findPath(root, expectedSum, 0, path);
}
private static void findPath(TreeNode root, int expectedSum, int sum, Stack<Integer> path) {
// 累加路径值
sum += root.val;
// 将当前节点加入路径中
path.push(root.val);
// 如果当前节点是叶子节点(即没有左右子节点),并且当前累加值等于期望值,则输出路径信息
if (root.left == null && root.right == null && sum == expectedSum) {
for (Integer val : path) {
System.out.print(val + " ");
}
System.out.println();
}
// 如果左子节点不为空,说明不是叶子节点,则继续寻找路径
if (root.left != null) {
findPath(root.left, expectedSum, sum, path);
}
// 如果右子节点不为空,说明不是叶子节点,则继续寻找路径
if (root.right != null) {
findPath(root.right, expectedSum, sum, path);
}
// 如果当前节点不符合要求,则从路径中移除当前节点
path.pop();
}
public static void main(String[] args) {
// 5
// 3 7
// 2 4
TreeNode root = buildTree();
findAllPathes(root, 12);
}
/**
* 创建tree:
* 5
* 3 7
* 2 4
* @return
*/
private static TreeNode buildTree(){
TreeNode root = new TreeNode(5);
TreeNode left = new TreeNode(3);
TreeNode left1 = new TreeNode(2);
TreeNode right1 = new TreeNode(4);
left.left = left1;
left.right = right1;
TreeNode right = new TreeNode(7);
root.left = left;
root.right = right;
return root;
}