Leetcode637. BFS는 두 갈래 트리의 레이어당 평균 값을 계산합니다.
제목
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.