关于深度优先搜索和广度优先搜索算法分析

深度优先和广度优先题解分析

    • 什么是深度优先算法
    • 什么是广度优先搜索
    • 通过一道算法题目来理解两种搜索算法

什么是深度优先算法

深度优先搜索(Depth-First-Search)是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。

这个举例一个简单的树结构
关于深度优先搜索和广度优先搜索算法分析_第1张图片
深度优先遍历结果为:ABDECFG

什么是广度优先搜索

广度优先搜索算法(英语:Breadth-First-Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。

还是沿用上面的树形结构
广度优先遍历结果为:ABCDEFG

通过一道算法题目来理解两种搜索算法

力扣 637.二叉树的层平均值
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。

示例:
关于深度优先搜索和广度优先搜索算法分析_第2张图片因为题目要求的是层平均值所以第一反应肯定是使用广度优先算法

bfs解法:
实现方法:
首先将根节点放入队列中,然后每次依次出队列内的元素,并且将每次循环出队的元素值记录并计算该层的平均值,接着判断出队的元素是否有左子树或者是右子树,有则加入到队列中。一直循环判断到末尾,循环的条件就是队列内是否还有元素。

代码:

class Solution {
    public List averageOfLevels(TreeNode root) {
        List averages = new ArrayList();
        Queue queue = new LinkedList();
        queue.offer(root);
        while (!queue.isEmpty()) {
            double sum = 0;
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                sum += node.val;
                TreeNode left = node.left, right = node.right;
                if (left != null) {
                    queue.offer(left);
                }
                if (right != null) {
                    queue.offer(right);
                }
            }
            averages.add(sum / size);
        }
        return averages;
    }
}

dfs解法:
虽然这题是求每一次的平均值但是依然能够使用深度优先搜索来解决。
因为深度优先搜索的顺序是从根节点出发到叶子节点,所以我们如果要获取他每一层的值就需要在从根节点到叶子节点的遍历过程中记录好每一个节点的值并为其标记是属于哪一层,在遍历结束后再来计算每一层的平均值。

代码:

class Solution {
    public List averageOfLevels(TreeNode root) {
    	List counts = new ArrayList(); //记录每一层元素的个数
        List sums = new ArrayList();//记录每一层元素值的总和
        dfs(root, 0, counts, sums);
        List averages = new ArrayList();
        int size = sums.size();
        for (int i = 0; i < size; i++) {
            averages.add(sums.get(i) / counts.get(i));
        }
        return averages;
    } 
    
    public void dfs(TreeNode root, int level, List counts, List sums) {
        if (root == null) {
            return;
        }
        //当每一层只有一个元素时,或者遍历某一层的第一个元素时一定是 level==sums.size(),当遍历到该层的其他数组时level<
        if (level < sums.size()) {
            sums.set(level, sums.get(level) + root.val);
            counts.set(level, counts.get(level) + 1);
        } else {
            sums.add(1.0 * root.val);
            counts.add(1);
        }
        dfs(root.left, level + 1, counts, sums);
        dfs(root.right, level + 1, counts, sums);
     }
}


你可能感兴趣的:(java,算法)