问题分析
题目:
分析:
该题可以分解为下面两个问题:
1. 根据层序遍历的结果构建出一颗二叉树
2. 层序遍历二叉树时,找到每一层最后一个节点的位置
解题思路
首先需要根据题目的输入,构建出这颗完全二叉树;然后根据层序遍历得到每一层节点权值的累加和,找出最大的即可;
那么如何得到每一层的权重的累加和呢?
通过一个指针来记录每一层的最后一个节点,当层序遍历的节点为当前层的最后一个节点时,判断当前层的累加和是不是最大即可;
那么如何记录每一层的最后一个节点在哪?
首先我们可以知道头结点head肯定是当前层最后一个节点,根据这一点,我们可以用一个节点curEnd来记录当前层的最后一个节点,在用一个节点nextEnd实时更新下一层最后一个节点的位置,当前层节点遍历的时候将自己的左右孩子加入到队列时,就更新nextEnd的指向,这样nextEnd在当前层遍历到最后一个节点的时候会指向下一层的最后一个节点的位置。
具体请看代码的实现。
代码
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static class Node{
int value;
Node left;
Node right;
public Node(int val){
value = val;
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int N = scan.nextInt();
// 将输入的数据保存到arr数组
int[] arr = new int[N];
for(int i = 0; i < N; i++) {
arr[i] = scan.nextInt();
}
// 根据层序遍历顺序构建完全二叉树
Queue<Node> que = new LinkedList<>();
Node head = new Node(arr[0]);
que.offer(head);
int index = 1;
while(!que.isEmpty()) {
Node cur = que.poll();
if(index < arr.length - 1) {
cur.left = new Node(arr[index++]);
cur.right = new Node(arr[index++]);
que.offer(cur.left);
que.offer(cur.right);
}
}
// 存放最终结果
int ans = 1;
// 指向当前层的最后一个节点
Node curEnd = head;
// 指向下一层的最后一个节点
Node nextEnd = null;
// 记录每一层权值的累加和
int sum = 0;
// 记录当前所在的层
int curLevel = 1;
// 记录最大累加的权值
int maxSum = Integer.MIN_VALUE;
// 层序遍历整颗完全二叉树
que.offer(head);
while(!que.isEmpty()) {
Node cur = que.poll();
if(cur.left != null) {
que.offer(cur.left);
// 更新下一层的最后一个节点位置
nextEnd = cur.left;
}
if(cur.right != null) {
que.offer(cur.right);
// 更新下一层的最后一个节点位置
nextEnd = cur.right;
}
sum += cur.value;
// 当前遍历的节点是否是当前层的最后一个节点
if(cur == curEnd) {
// 若为最后一个节点,更新最大的累加权值
if(sum > maxSum) {
ans = curLevel;
maxSum = sum;
}
// 重新开始累加下一层的权值
sum = 0;
// 更新当前最后一个节点为下一层的最后一个节点
curEnd = nextEnd;
// 当前深度加1
curLevel++;
}
}
System.out.println(ans);
scan.close();
}
}