完全二叉树的权值-蓝桥183-二叉树

2024-04-10 17:36

本文主要是介绍完全二叉树的权值-蓝桥183-二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注意用long long

法1:按数的序号加

pow在c的math头文件里,所以在c++的cmath

非常注意内部按数的序号加每层权值和时,一定要添加i<=n啊,因为这是完全二叉树,不是满二叉树,最后一层可能缺胳膊少腿的

完整代码:

#include<iostream>
#include<cmath>
using namespace std;typedef long long ll;
ll a[100010];int main(){int mindeep=1,n;cin>>n>>a[1];for(int i=2;i<=n;i++){cin>>a[i];}ll max=a[1];int i=2,deep=2;while(i<=n){ll sum=0;for(;i<=n&&i<=pow(2,deep)-1;i++)//因为我少些了i<=n而错啊啊啊啊啊{sum+=a[i];}if(sum>max){max=sum;mindeep=deep;}deep++;}cout<<mindeep;return 0;
}

法2:按层加

引入sum[]数组来记录第几层的权值和

求序号在二叉树的第几层,就是用它除以2,能除几次在第几层,其实就是log2(x),但是直接用log函数可能有问题

x>>=1即左移两位,等价于x=x>>1;  或者x=x/2;

这里有三种求最大权值和的最浅层数,13同理,只有23是对的

1	while(deep--){//从最底层往上走,求得的一定是深度最小的if(max<=sum[deep]){max=sum[deep];mindeep=deep;}}
2	for(int i=2;i<=deep;i++){if(max<sum[i]){max=sum[i];mindeep=i;}}
3	for(int i=deep;i>=1;i--){//从最底层往上走,求得的一定是深度最小的//记得要包含i=1if(max<=sum[i]){max=sum[i];mindeep=i;}}

完整代码:

​
#include<iostream>
#include<cmath>
using namespace std;typedef long long ll;
ll a[100010];ll sum[100];//sum[i]为第i层的权值和
int deeplog(ll x){//能求出序号x在二叉树的第几层int deep=0;while(x){x>>=1;deep++;}return deep;
}
int main(){int n;cin>>n;ll deep=deeplog(n);//规定层数1~for(int i=1;i<=n;i++){cin>>a[i];sum[deeplog(i)]+=a[i];}ll max=sum[1];int mindeep=1;
/*	while(deep--){//从最底层往上走,求得的一定是深度最小的if(max<=sum[deep]){max=sum[deep];mindeep=deep;}}*/
/*	for(int i=2;i<=deep;i++){if(max<sum[i]){max=sum[i];mindeep=i;}}*/for(int i=deep;i>=1;i--){//从最底层往上走,求得的一定是深度最小的//记得要包含i=1if(max<=sum[i]){max=sum[i];mindeep=i;}}cout<<mindeep;return 0;
}​

这篇关于完全二叉树的权值-蓝桥183-二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891708

相关文章

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt

uva674(完全背包)

题意: 有5种硬币1,5,10,25,50,;现在随意的给出一个价钱,问你有几种组合方式! 输入11 输出4 1+...+1(10个),5+(6*1),5+5+1,  10+1(共4种) 思路; 满足完全背包思想,状态转移方程:dp[i+num[k]] += dp[i](dp[i]为组合成i的不重复种数,num[k]分别为1,5,10,25,50)不能合在一起转移,否则会导致重复!

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ