天是大年初七,继续坚持居家不外出,早上在盒马生鲜买点菜做饭,中午看看书,晚上刷几道题目。先不扯淡,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题目。