完全二叉树的权值

【问题描述】
给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从
上到下、从左到右的顺序依次是 A1, A2, · · · AN,如下图所示:

现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点
权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。

注:根的深度是 1。

【输入格式】
第一行包含一个整数 N。
第二行包含 N 个整数 A1, A2, · · · AN 。

【输出格式】
输出一个整数代表答案。

【样例输入】
7
1 6 5 4 3 2 1

【样例输出】
2
【评测用例规模与约定】
对于所有评测用例,1 ≤ N ≤ 100000, 100000 ≤ Ai ≤ 100000。

第一种解法的思路:

可以不需要构建二叉树的结构,直接利用完全二叉树的深度和节点个数的特性来做,只需要准备一个临时数组,存储二叉树每一层的值并在循环过程中替换最大值,并将修改最大深度。

完全二叉树的特性:每层(除最后一层)的节点数 = 2的n次方.(深度从0开始)

即Math.pow(2,i)的值也就是内层循环的循环次数,用来求该层的权值和。

二叉树中每层第一个节点的下标关系:j = Math.pow(2,i)-1; i是深度(从0开始)

代码如下:


import java.util.Scanner;public class Main {public static void main(String[] args){int n;Scanner s = new Scanner(System.in);n = s.nextInt();if (n == 1){System.out.println(1);return;}int[] a = new int[n];for(int i=0;i<n;i++){a[i] = s.nextInt();}int sum[] = new int[n];;int index = 0;int deep = 1;int max = a[0];for(int i=0;i<n/2;i++){//二叉树中每层第一个节点的下标关系:j = Math.pow(2,i)-1; i是深度(从0开始)for(int j = (int) Math.pow(2,i)-1, k = 0; k<Math.pow(2,i) && j<n ; k++,j++){sum[index] += a[j];}//更新当前的最大值if (sum[index] > max){max = sum[index];//深度是从1开始,需要+1deep = index + 1;}index++; //准备计算下一层的权值和}System.out.println(deep);}
}

第一种解法在蓝桥杯官网的提交结果

第二种解法的思路:

可以自己构建一个二叉树的结构,然后利用二叉树的层次遍历方法求每一层的权值和并进行比较,记录最大的深度。

这种解法的关键在于按每层来构建二叉树和根据当前层的节点数求当前的深度

  二叉树中节点数和深度的关系:当前深度等于log以2为底,当前的节点个数(size)为真数求出的结果取整再+1。即depth = (int)log2(size) + 1;

        但java没有直接以2为底求的log值方法,所以需要利用log的换底公式:

代码如下:


import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Map;
import java.util.Scanner;/*** 完全二叉树的权值*/
public class Main {static int n = 0;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();int arr[] = new int[n];for (int i = 0; i < n; i++) {arr[i] = sc.nextInt();}//第一个值为根节点Tree root = new Tree(arr[0]);//创建树createTree(arr, root);int max = cal(root);System.out.println(max);}//计算最终结果private static int cal(Tree root) {ArrayDeque<Tree> queue = new ArrayDeque<>();//先将根节点入队queue.add(root);int depth;int maxDepth = 1;int max = root.value;int sum; //计算每层的权值和while (!queue.isEmpty()){//每次循环结束,都需要将sum置为0sum = 0;int size = queue.size(); //当前队列中的元素个数就是每层的节点数,也就是要循环的次数//***求当前的深度//二叉树中深度与节点数的关系:depth = (int)log2(size) + 1;//因为计算机里面没有log以2为底的对数,所以我们可以利用log的换底公式depth = (int) (Math.log(size)/Math.log(2)) + 1;for (int i = 0; i < size; i++) {Tree node = queue.poll();if (node.left != null){sum += node.left.value;queue.add(node.left);}if (node.right != null){sum += node.right.value;queue.add(node.right);}}if (sum > max) {max = sum;maxDepth = depth;}}return maxDepth+1; //注意最后+1,题目说的深度从1开始}//利用队列来构建二叉树public static void createTree(int[] values, Tree node) {ArrayDeque<Tree> queue = new ArrayDeque<>();queue.add(node);int depth = 0;while (!queue.isEmpty() && (2 * depth + 2 <= values.length)) {Tree temp = queue.poll();if (temp.left == null) {temp.left = new Tree(values[2 * depth + 1]);queue.add(temp.left);}if (temp.right == null && 2 * depth + 2 < values.length) {temp.right = new Tree(values[2 * depth + 2]);queue.add(temp.right);}depth++;}}}
//二叉树的节点class Tree {int value;Tree left;Tree right;public Tree(int value) {this.value = value;}
}

第二种解法在蓝桥杯官网的提交结果

总结:以上两种方法虽然都能全部通过问题案例,但是第一种方法实现起来更简单,代码量更少,也更容易想到,不过第二种解法可以作为加强学习二叉树的数据结构来写。

完全二叉树的权值——两种解法相关推荐

  1. 刷题之完全二叉树的权值和小字辈及根据后序和中序遍历输出先序遍历

    1.完全二叉树的权值 1)题目 给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下.从左到右的顺序依次是 A1, A2, ··· AN,如下图所示: 现在小明要把相同深度的节 ...

  2. 牛客--追债之旅 两种解法

    文章目录 第一种 第二种: 一共两种解法,所以即便你不会最短路,也可以做,甚至爆搜+剪枝的时间和空间消耗小于最短路做法. 第一种 题意: 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市 ...

  3. 北林oj-算法设计与分析-Line up in the canteen(两种解法,附思路)

    描述 One day, there is a kind of new delicious food from one of the windows in the canteen. All studen ...

  4. 洛谷——P1597 语句解析(两种解法)

    P1597 语句解析(两种解法) 题目背景 木有背景-- 题目描述 一串长度不超过 255 的 PASCAL 语言代码,只有 a,b,c 3 个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变 ...

  5. 整数拆分的两种解法(已完成)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 整数拆分 ...

  6. usaco Ordered Fractions 顺序的分数(两种解法)

    这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...

  7. 约瑟夫环问题的两种解法(详解)

    约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...

  8. 2019/Province_C_C++_A/F/完全二叉树的权值

    完全二叉树的权值 Code Python if __name__ == '__main__':N = int(input())A = list(map(int, input().split()))cu ...

  9. leetcode 73 矩阵置零 C++ 两种解法

    leetcode 73 两种解法~~,没有一个是我想出来的,哈哈~~ one class Solution {public:void setZeroes(vector<vector<int ...

  10. 动态规划——钢筋切割问题的两种解法解析

    动态规划问题--钢筋切割问题的两种解法解析@TOC 钢筋切割问题: 对于这个问题的两种解法 先来个官方点的解法说明: 我对两种解法的个人理解 第一种解法: 这种解法就是把先钢筋分成两部分,分别记为 i ...

最新文章

  1. 查找无序数组中第K大的数
  2. C# 线程手册 第五章 扩展多线程应用程序 系列
  3. 5个专注于检测和预测异常的Java工具分享
  4. @CachePut(与@Cacheable的差异)@CacheEvict
  5. 人气TOP|当红炸子鸡「小明机器人」,出道走花路啦
  6. mybatis的$和#详解分析
  7. Win32ASM学习[8]: 进制转换的库函数
  8. python设置excel的格式_python使用xlrd与xlwt对excel的读写和格式设定
  9. 小学计算机教室管理制度范本,《中小学微机室规章制度》.doc
  10. python3.7 keras和tensorflow兼容_解决Keras 与 Tensorflow 版本之间的兼容性问题
  11. 初级测试开发工程师应该学些什么
  12. 路由器选华硕还是tp_华硕路由器设置
  13. Java 学习 类和对象练习 设计一个类Armor护甲 继承Item类并且额外提供一个属性ac: 护甲等级 int类型 实例化出两件护甲 名称 价格 护甲等级 布甲 300 15 锁子甲 500 40
  14. 校园招聘Offer、三方协议、两方协议、劳动合同到底都是什么?怎样避免被坑?
  15. DDR3 CONTROLLER-PHY物理层
  16. 单片机、ARM、MUC、DSP、FPGA、嵌入式
  17. python中文文本情感分析
  18. 最长黑白相间连续串(有规律)
  19. 百度ApolloScape Dataset 用于目标检测任务
  20. k30最小宽度380不管用了_黄金分割:用数学让你的摄影构图,更有意思!

热门文章

  1. hnu 数字电路 实验1.1 异或门
  2. Weighted Quick Union
  3. bootstrapTreeTable 树性插件不能够自动展开的问题
  4. 在线绘制函数图像和在线图标绘制网址
  5. 十进制转换为三进制数_python3实现
  6. [转载】中移物联网NB模组注册指令生成小工具-M5310/M5310_A
  7. [转载]刘光斗-刘晚苍系武学传人概况
  8. 克莱斯勒等公司宣布召回缺陷汽车
  9. 无法使用安全密码身份验证登录到服务器,使用安全密码验证登录(SPA)”后为什么登录失败...
  10. 数学建模——计算机工具的使用(1)——SPSS操作以及在统计分析中的应用