天是大年初七,继续坚持居家不外出,早上在盒马生鲜买点菜做饭,中午看看书,晚上刷几道题目。先不扯淡,so今天按系列刷3道关于DFS算法思想的题目。
所谓DFS也就是深度优先搜索算法,和BFS一样本质上还是借助递归思想,比如二叉树的前、中、后序遍历就是经典的DFS算法。今天先不列出这几种遍历,对于leetcode上的589题,94题,590题以及429题和107题可以自己去练习。
104. Maximum Depth of Binary Tree
题目:二叉树的最大深度,也就是二叉树的最大层数。
举例:给定一个二叉树 [3,9,20,null,null,15,7]
3 / \ 9 20 / \
思路:首先可以初始化一个变量maxDep=0。然后我们可以前序遍历每一个节点,计算该节点所在的层数。如果该节点为叶子节点,则更新最大值的变量maxDep。
public class Solution { public int maxDep = 0; public int maxDepth(TreeNode root) { preOrder(root,1);//辅助函数,借助前序遍历 return maxDep; } public void preOrder(TreeNode root,int level){ if(root == null) return; if(root.left==null && root.right==null){ //到叶子节点 更新最大深度值 if(level>maxDep) maxDep = level; } preOrder(root.left,level+1); preOrder(root.right,level+1); }}
111. Minimum Depth of Binary Tree
题目:求一个二叉树的最小节点深度,也就是无叶子节点所在的层数。
举例:给定一个二叉树 [3,9,20,null,null,15,7]
3 / \ 9 20 / \
思路:借助上面题目的实现思路,我们还可以借助前中后序遍历的方法,使用一个变量min记录最小值。这里需要注意将min初始化为一个比较大的值,如果根节点为空注意返回0。整体实现难度不大,参考代码如下:
public class Solution { public int min = Integer.MAX_VALUE; public int minDepth(TreeNode root) { if(root ==null) return 0; preOrder(root,1); return min; } public void preOrder(TreeNode root ,int level) { if(root==null) return; if(root.left== null && root.right==null) { if(level < min) min = level; } preOrder(root.left,level+1); preOrder(root.right,level+1); }}
226. Invert Binary Tree
题目:翻转一颗二叉树。
举例:
/ \ 2 7 / \ / \ 1 3 6 9
/ \ 7 2 / \ / \ 9 6 3 1
思路:借助于二叉树的前中后序遍历可以轻松实现翻转二叉树。参考代码如下所示
public TreeNode invertTree(TreeNode root) { postOrder(root);//辅助函数,后续遍历 return root;}public void postOrder(TreeNode root){ if(root==null) return; invertTree(root.right); invertTree(root.left); TreeNode temp = root.left; root.left = root.right; root.right = temp;}
当然了,也可以采用非递归版本的层次遍历,参考代码如下:
public TreeNode invertTree(TreeNode root) { levelOrder(root);//辅助函数,层次遍历 return root;}public void levelOrder(TreeNode root){ if(root==null) return; Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.offer(root);//压入节点 while(!queue.isEmpty()){ TreeNode node = queue.poll(); if(node.left!=null) queue.offer(node.left); if(node.right!=null) queue.offer(node.right); //交换节点 TreeNode temp = node.left; node.left= node.right; node.right = temp; }}
总结:本文虽然介绍了3道题目,其他5道基础的二叉树前序、中序、后续、层次遍历的题目没有列出来,但是也都有涉及。关于DFS相关的题目,这三题是基础的,面试会问到。当然了,后续我们还会涉及到几题更难一些的DFS题目。