十届省赛真题蓝桥杯完全二叉树的权值,详细注释

该程序使用Java实现,通过遍历一棵完全二叉树的节点,利用树的性质计算具有最大权值的最小深度。在遍历过程中,动态维护当前深度的权值和,判断是否到达最后一层以及每个节点是否为该层的最后一个节点,更新最大权值和对应的深度。
摘要由CSDN通过智能技术生成

利用树的性质

主要两个点:

最后一层节点可能不是满的,所以需要加上这个判断条件 (i == n-1)
下一层的节点数是上一层的节点数*2,通过判断当前第几个节点是否==该层总结点数,来确定是否到达该层最后一个,若是则需要将当前第几个节点和该层权值和置零,方便下一层计数

import java.util.Scanner;

public class 第十届_完全二叉树的权值 {
	static int n;
	static int[] tree;
	static int sum;		// 某深度的最大权值
	static int tempSum;	// 当前深度所有节点的权值
	static int dept;	// 存放结果即权值最大的最小深度
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		tree = new int[n];
		for(int i = 0; i<n; i++) {
			tree[i] = sc.nextInt();
		}
		
		/**
		 * curDept 当前深度
		 * curDeptCount 当前深度的第几个
		 * curDeptNum	当前深度总共有几个节点
		 */
		for(int i = 0, curDept = 1, curDeptCount = 1, curDeptNum = 1; i<n; i++,curDeptCount++) {
			if(i == 0) {	// 第一层即根节点,直接把权值赋值
				sum = tree[i];	
				dept = curDept;
			}
			else {	// 计算每一层
				if(curDeptCount == 1) {	// 当前层的第一个,则将深度+1
					curDept++;
					tempSum += tree[i];
//					curDeptCount++;
				} else {
					tempSum += tree[i];
//					curDeptCount++;
				}
				if(tempSum > sum && i == n-1) {	// 如果最后一层不是满的并且该层权值和大于sum,则赋值
					sum = tempSum;
//					curDeptCount = 0;
//					tempSum = 0;
					dept = curDept;
				}
			}
			if(curDeptCount == curDeptNum) {	// 如果走到该层最后一个
				if(tempSum > sum) {
					sum = tempSum;
					dept = curDept;
				}
				// 需要将下一层的总节点数算出来
				curDeptNum*=2;
				// 置零,方便下一层计数
				curDeptCount = 0;
				tempSum = 0;
			}
		}
		System.out.print(dept);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值