DFS深度优先算法
简单的理解深度优先算法遍历树结构,算法从节点出发沿着子节点一直往下走,走到没有字节点为止开始返回,即一直走到树的最深处(叶节点),然后开始往前返回值。
递归DFS
深度优先算法的递归表示十分简洁,理解递归DFS十分有助于理解树结构以及递归。
public void dfsRecursive(TreeNode root){
//对于递归算法,basecase是首要考虑的
if (root==null) return ans;
//在两次递归之前fc进行操作即为前序遍历
dfsRecursive(root.left);
System.out.println(root.val);//在两次递归之间进行操作即为中序遍历
dfsRecursive(root.right);
//在两次递归之后进行操作即为后序遍历
return ans;
}
非递归DFS
根据DFS的定义,DFS一路往深处走,并记录走过的节点,走到底时再进行弹出并输出。因此很容易想到需要使用栈结构。
public void dfs(TreeNode root) {
if(root==null) return;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (stack.size() > 0) {
TreeNode node = stack.pop();
//同样的如果要进行的操作在递归之前,那么就是前序遍历,见名知意
System.out.println(node.val);
if (node.right != null) stack.push(node.right);
if (node.left != null) stack.push(node.left);
}
}
通过DFS递归与非递归的算法可以很容易的完成非常基础的leetcode树的遍历题
BFS广度优先算法(非递归)
广度优先算法BFS,又称层序遍历,正如其名,按一层一层遍历树结构,一般情况下只有非递归的表达,由于其算法按层遍历的特性,其中用到的数据结构为Queue队列,因此递归的表达较为复杂。
public void bfs(TreeNode root) {
if (root == null) return void;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (queue.size() > 0) {
for (int i = 0; i < queue.size(); i++) {
TreeNode node = queue.poll();
System.out.println(node.val);
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
}
}
leetcode关于bfs的题目,这里推荐两道十分基础的便于熟悉算法:
- 102. 二叉树的层序遍历
-
剑指 Offer 55 - I
BFS与DFS都是图以及树中的十分基础却又十分强大的算法,熟练掌握这两个算法便已经可以解决不少leetcode中关于树和题的问题。