今天刷的题是LeetCode第104题,说的是给定一个二叉树,找出树的最大深度。
所谓二叉树的深度是指根节点到最远叶子节点的最长路径的节点数
首先想到的是递归法。递归法其实就是图中的深度优先算法。该算法与走迷宫类似,当遇到一个岔口的时候,就选择其中一条路走到头,当找不到出口的时候,再回到上一个岔口走另一条道路。
该算法使用递归解决,其边界条件是当节点为null的时候,就返回0.具体地代码如下:
public static int max(TreeNode root){ //深度优先算法 if (root==null)return 0; else { int leftHeight=max(root.left); int rightHeight=max(root.right); return Math.max(leftHeight,rightHeight)+1; } }
其中使用到的TreeNode定义如下:
public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode (int x){ val=x; } }
针对该问题的另一种解法是层次遍历法,也就是图搜索中的广度优先算法。该算法是指先将节点的一度节点加入到队列中,在遍历的时候,吧二度节点也加入到队列中。但是遍历的时候都是先把一度节点遍历完,再遍历二度节点。并以此类推。
广度优先算法的具体代码如下所示:
public static int bfsMax(TreeNode root){ //采用广度优先算法 //首先定义一个队列,将需要访问的一度好友放入到队列中 if (root==null)return 0; Queue<TreeNode> queue=new LinkedList<>(); queue.add(root); int height=0; int levelSize=1; while (!queue.isEmpty()){ TreeNode node=queue.poll(); levelSize--; if (node.left!=null)queue.add(node.left); if (node.right!=null)queue.add(node.right); //特别注意这里的条件判断。levelsize存储的是每一层的个数,需要吧每一层的个数都遍历完,才深度加1
if (levelSize==0){ height++; levelSize=queue.size(); } } return height; }