引言
今天学习了下这两种搜索的异同点,所以想把这两种写法的模板记录下,以后刷题用。在刷编程题目时,需要把题目的解题思路抽象成树的模型。
模板写法
既然解题思路是抽象树模型,我们就需要先定义下节点类,如下:
/**
* 自定义节点类
*/
private static class Node {
// 当前节点能访问到的子节点
private List<Node> childNodes = new ArrayList<>();
// 访问标志位
private boolean isVisited = false;
// 节点数据
private int data;
public Node(int data) {
this.data = data;
}
public void addChildNodes(Node childNode) {
childNodes.add(childNode);
}
}
- DFS(Deep First Search)模板 。DFS用栈的写法,即先进后出原则。
/**
* 用栈实现DFS
*
* @param node 开始搜索的节点
*/
private static void dfs(Node node) {
Stack<Node> stack = new Stack<>();
// 添加开始搜索的节点入栈
stack.push(node);
// 栈清空的时候,就是全部搜索完成的时候
while (stack.size() > 0) {
// 开始访问节点,被访问过的节点标志位置为true,防止回溯访问
Node visitedNode = stack.pop();
visitedNode.isVisited = true;
// 这里的childNode表示可以被visitedNode访问的子节点
for (Node childNode : visitedNode.childNodes) {
if (!childNode.isVisited) {
// 没有被访问过的子节点入栈
stack.push(childNode);
// 入栈后标记为访问过,防止回溯访问
childNode.isVisited = true;
}
}
System.out.println(visitedNode.data + "");
}
}
- BFS(Breath First Search)模板 。BFS用队列的写法,先进先出原则。
/**
* 用队列实现BFS
*
* @param node 开始搜索的节点
*/
private static void bfs(Node node) {
Queue<Node> queue = new LinkedList<>();
// 添加开始搜索的节点入队
queue.offer(node);
// 队列清空的时候,就是全部搜索完成的时候
while (queue.size() > 0) {
// 开始访问节点,被访问过的节点标志位置为true,防止回溯访问
Node visitedNode = queue.poll();
visitedNode.isVisited = true;
// 这里的childNode表示可以被visitedNode访问的子节点
for (Node childNode : visitedNode.childNodes) {
if (!childNode.isVisited) {
// 没有被访问过的子节点入队
queue.offer(childNode);
// 入队后标记为访问过,防止回溯访问
childNode.isVisited = true;
}
}
System.out.println(visitedNode.data + "");
}
}
题目
leetcode 690题 员工的重要性
给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id。
比如,员工1是员工2的领导,员工2是员工3的领导。他们相应的重要度为15, 10, 5。那么员工1的数据结构是[1, 15, [2]],员工2的数据结构是[2, 10, [3]],员工3的数据结构是[3, 5, []]。注意虽然员工3也是员工1的一个下属,但是由于并不是直系下属,因此没有体现在员工1的数据结构中。
现在输入一个公司的所有员工信息,以及单个员工id,返回这个员工和他所有下属的重要度之和。
示例1:
输入: [[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1
输出: 11
解释:
员工1自身的重要度是5,他有两个直系下属2和3,而且2和3的重要度均为3。因此员工1的总重要度是 5 + 3 + 3 = 11。
注意:
一个员工最多有一个直系领导,但是可以有多个直系下属
员工数量不超过2000。
leetcode 113题 路径总和 II
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
总结
你学废了吗?