一道简单的深度优先搜索的题目:leetcode
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
直接上代码,用代码来解释
List<List<Integer>> res = new LinkedList<List<Integer>>(); // 全局变量,记录结果
Deque<Integer> path = new LinkedList<Integer>(); // 全局变量,记录路径
public List<List<Integer>> pathSum(TreeNode root, int sum) {
dfs(root,sum);
return res;
}
private void dfs(TreeNode node, int sum){
if(node == null) return ; // 循环中止条件
path.offerLast(node.val); // 入队
sum -= node.val;
// 如果是叶子结点,且总和等于 sum,记录结果
if(node.left == null && node.right == null && sum == 0){
res.add(new LinkedList(path));
}
dfs(node.left, sum);
dfs(node.right, sum);
path.pollLast(); // 出队
}
当然,这道题目也可以用广度优先算法来处理,有兴趣可以试下,这里直接给出官方题解
List<List<Integer>> ret = new LinkedList<List<Integer>>();
Map<TreeNode, TreeNode> map = new HashMap<TreeNode, TreeNode>();
public List<List<Integer>> pathSum(TreeNode root, int sum) {
if (root == null) {
return ret;
}
Queue<TreeNode> queueNode = new LinkedList<TreeNode>();
Queue<Integer> queueSum = new LinkedList<Integer>();
queueNode.offer(root);
queueSum.offer(0);
while (!queueNode.isEmpty()) {
TreeNode node = queueNode.poll();
int rec = queueSum.poll() + node.val;
if (node.left == null && node.right == null) {
if (rec == sum) {
getPath(node);
}
} else {
if (node.left != null) {
map.put(node.left, node);
queueNode.offer(node.left);
queueSum.offer(rec);
}
if (node.right != null) {
map.put(node.right, node);
queueNode.offer(node.right);
queueSum.offer(rec);
}
}
}
return ret;
}
public void getPath(TreeNode node) {
List<Integer> temp = new LinkedList<Integer>();
while (node != null) {
temp.add(node.val);
node = map.get(node);
}
Collections.reverse(temp);
ret.add(new LinkedList<Integer>(temp));
}
代码不难理解,但理解是一回事,能写出来,是另外一回事