【每日一题】蓝桥杯历届真题练习--完全二叉树的权值

解题思路:这道题是对二叉树的考察,算简单题,知道每层结点数的计算就可以了,每层结点数等于2^(k-1)。以及计算n个结点的二叉树的总层数 2^k - 1 = n 。知道层数以及每一层的结点数,然后按每一层每一层去算权值和即可。代码如下:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));

	public static int Int(String s) {
		return Integer.parseInt(s);
	}

	public static void main(String[] args) throws IOException {
		int n = Int(in.readLine());// 读取结点个数
		// 计算层数,向上取整 2^k - 1 = n ==> k = log2(n+1),因为Math没有log2的函数,只能用换底公式实现log2(N)了
		int hight = (int) Math.ceil((Math.log(n + 1) / Math.log(2)));
		String[] s = in.readLine().split(" ");// 读取树的权值
		int cnt = 0;// 数组的下标,记录当前读取的结点下标。
		int depth = 1;// 最大权值和的层数,默认第一层
		int max = Int(s[cnt++]);// 最大权值和,默认第一层结点的权值
		for (int i = 2; i <= hight; i++) {// 从第二层开始
			int N = (int) Math.pow(2, i - 1);// N是每层的个数 2^(k-1)
			int sum = 0;// 每层的权值和
			for (int j = 0; j < N && cnt < n; j++) {// 每层读取相应的个数,cnt<n确保最后一行的叶子结点不够当前层的结点个数(不过这道题已经说明完全二叉树了)
				sum += Int(s[cnt++]);
			}
			if (max < sum) {// 当前层的权值和比之前的大,更新
				depth = i;
				max = sum;
			}
		}
		System.out.println(depth);// 输出结果
	}

}

做题时:一开始想复杂了打算采用二维数组来记录,i代表层数,j代表每层的结点,题目数据N最大等于100000,算出层数至少17层,最后一层63000+,觉得数组好像浪费了很多空间,打算new每层结点数大小的数组,傻了吧唧的,反应过来根本就不用定义数组哇,都想到了每层每层存储了,那直接每层权值加起来得到权值和 跟 前面的比不就好了。

猜你喜欢

转载自blog.csdn.net/adminguojieBin/article/details/123411600