题目:给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值
的路径。
一个有效的路径,指的是从根节点到叶节点的路径。
例:
给定一个二叉树,和 目标值 = 5
:
1
/ \
2 4
/ \
2 3
返回:
[
[1, 2, 2],
[1, 4]
]
看完题目,发现是和二叉树相关的题目,不由得,又温习了一遍二叉树的遍历
首先定义一下通用是树结构
public class TreeNode {
public int val;
public TreeNode left, right;
public TreeNode(int val) {
this.val = val;
this.left = this.right = null;
}
}
1、先序遍历
public static void preOrderTraverse(TreeNode node) {
if (node == null)
return;
System.out.print(node.val+ " ");
preOrderTraverse(node.left);
preOrderTraverse(node.right);
}
2、中序遍历
public static void inOrderTraverse(TreeNode node) {
if (node == null)
return;
inOrderTraverse(node.left);
System.out.print(node.val + " ");
inOrderTraverse(node.right);
}
3、后序遍历
public static void inOrderTraverse(TreeNode node) {
if (node == null)
return;
inOrderTraverse(node.left);
inOrderTraverse(node.right);
System.out.print(node.val + " ");
}
然后在看问题,要求是找出所有符合的路径。那么首先就需要的是遍历所有的路径,一个比较简单的方法,就是使用栈把当前节点的值,放入栈中,然后用于计算
Stack<Integer> tempStack = new Stack<Integer>();
tempStack .push(root.val);
然后根据从左到右的顺序,递归计算,到达最底层时,开始出栈
if(root.left != null)
递归
if(root.right != null)
递归
tempStack .pop();
代码实现如下:
public List<List<Integer>> binaryTreePathSum(TreeNode root, int target) {
List<List<Integer>> path = new ArrayList<List<Integer>>();
if(null == root) return path ;
Stack<Integer> tempStack = new Stack<Integer>();
getResultPath(path, tempStack, root, 0, target);
return path;
}
public void getResultPath(List<List<Integer>> path, Stack<Integer> tempStack, TreeNode root, int sum, int target) {
sum += root.val;
tempStack.push(root.val);
if(sum == target && root.left == null && root.right == null) {
List<Integer> list = new ArrayList<Integer>(tempStack);
path.add(list);
tempStack.pop();
return;
}else {
if(root.left != null)
getResultPath(path, tempStack, root.left, sum, target);
if(root.right != null)
getResultPath(path, tempStack, root.right, sum, target);
tempStack.pop();
}
}