Leetcode637. BFS는 두 갈래 트리의 레이어당 평균 값을 계산합니다.

3839 단어

제목


Input:  3 /\  9 20 /\  15 7
Output: [3, 14.5, 11]
Explanation:  The average value of nodes on level 0 is 3, on level 1 is 14.5, and on level 2 is 11. Hence return [3, 14.5, 11].

문제 풀이 분석


문제의 예시에서 우리는 제목이 두 갈래 나무의 각 층의 노드를 훑어보고 그 평균치를 계산해야 한다는 것을 대충 알 수 있다.두 갈래 트리의 검색은 이 몇 가지 방법과 다름없다. 먼저 훑어보기, 중간 훑어보기, 뒤로 훑어보기, BFS, DFS.제목과 결합하면 BFS가 제목에 비교적 적합한 방법임이 분명하다.그러면 문제가 생겼다. 어떻게 하면 두 갈래 나무의 각 층의 노드를 왼쪽에서 오른쪽으로 옮겨다니게 하고 그 노드의 개수와 노드의 총계를 계산할 수 있겠는가.
우리는 대열로 이 문제를 생각해도 무방하다.우리는 먼저 대기열에push 루트 노드를 이동한 다음, 대기열이 비어 있지 않을 때, 전체 대기열을 훑어봅니다.대기열의 노드를 훑어볼 때마다 값을 꺼내서 팝업합니다.이 때 왼쪽 하위 노드가 비어 있는지 확인하고, 비어 있지 않으면 하위 노드push를 대기열에 넣습니다.이렇게 해서 마침 한 층의 노드를 두루 훑어보았는데, 다음 층의 노드는 모두 대열에 저장되었다.한 층씩 마지막 층까지 순환하면 문제는 순조롭게 해결된다.
방법 1:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List < Double > averageOfLevels(TreeNode root) {
        List < Integer > count = new ArrayList < > ();
        List < Double > res = new ArrayList < > ();
        average(root, 0, res, count);
        for (int i = 0; i < res.size(); i++)
            res.set(i, res.get(i) / count.get(i));
        return res;
    }
    public void average(TreeNode t, int i, List < Double > sum, List < Integer > count) {
        if (t == null)
            return;
        if (i < sum.size()) {
            sum.set(i, sum.get(i) + t.val);
            count.set(i, count.get(i) + 1);
        } else {
            sum.add(1.0 * t.val);
            count.add(1);
        }
        average(t.left, i + 1, sum, count);
        average(t.right, i + 1, sum, count);
    }
}

방법 2
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List < Double > averageOfLevels(TreeNode root) {
        List < Double > res = new ArrayList < > ();
        Queue < TreeNode > queue = new LinkedList < > ();
        queue.add(root);
        while (!queue.isEmpty()) {
            long sum = 0, count = 0;
            Queue < TreeNode > temp = new LinkedList < > ();
            while (!queue.isEmpty()) {
                TreeNode n = queue.remove();
                sum += n.val;
                count++;
                if (n.left != null)
                    temp.add(n.left);
                if (n.right != null)
                    temp.add(n.right);
            }
            queue = temp;
            res.add(sum * 1.0 / count);
        }
        return res;
    }
}

추가 queue 필요 없음:
 public List averageOfLevels(TreeNode root) {
        List result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        
        Queue q = new LinkedList<>();
        q.add(root);
        double sum = 0;
        while (!q.isEmpty()) {
            int size = q.size();
            for (int i = 0; i < size; ++i) {
                TreeNode node = q.poll();
                sum += node.val;
                if (node.left != null) {
                    q.add(node.left);
                }
                
                if (node.right != null) {
                    q.add(node.right);
                }
            }
            
            result.add(sum / size);
            sum = 0;
        }
        
        return result;
    }

좋은 웹페이지 즐겨찾기