题目描述:
输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。路径定义为从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
分析:
对于树的遍历一般就是深度遍历和广度遍历下四种中的一种,从根节点往下找到叶节点形成一条路径,若是和为给定的值这个路径便是需要找的路径,从根节点到叶节点边访问边相加判断可以采用先序遍历。
(1)若根节点的值大于给定的值或者根节点为空,则清空路径;
(1)若根节点的值等于给定的值,需要判断当前节点是否为叶子节点,若为叶子节点,则是需要找的一条路径,若不是,将保存的节点全部清空。
(2)若根节点的和小于给定的值,则分别去访问其左右子树。
代码如下:
/**
* 二叉树中和为某一值的路径
*/
public class Solution {
public void findPath(BinaryTreeNode root, int expectedSum) {
if(root == null)
return ;
// 使用栈来保存路径上的节点
Stack<Integer> stack = new Stack<>();
int currentSum = 0;
findPath(root, expectedSum, stack, currentSum);
}
public void findPath(BinaryTreeNode root, int expectedSum, Stack<Integer> stack, int currentSum) {
stack.push(root.value);
currentSum += root.value;
boolean isLeaf = (root.left == null) && (root.right == null);
//如果该节点为叶子节点,并且路径和等于expectedSum
if(currentSum == expectedSum && isLeaf){
// 打印路径
printStack(stack);
}
//如果不是叶节点,则遍历它的子节点
if(root.left != null){
findPath(root.left, expectedSum, stack, currentSum);
}
if(root.right != null){
findPath(root.right, expectedSum, stack, currentSum);
}
//在返回父节点之前,在路径上删除当前节点
stack.pop();
currentSum -= root.value;
}
//打印栈(从栈底到栈顶打印)
public void printStack(Stack<Integer> stack){
Stack<Integer> tempStack = new Stack<>();
while(!stack.isEmpty()){
tempStack.add(stack.pop());
}
while(!tempStack.isEmpty()){
int num = tempStack.pop();
System.out.println(num + " ");
stack.add(num);
}
}
}
//二叉树节点
class BinaryTreeNode {
int value;
BinaryTreeNode left;
BinaryTreeNode right;
}