leetcode刷题10

今天刷的题是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; }

 

posted @ 2019-08-14 15:25  刘云生  阅读(117)  评论(0编辑  收藏  举报