2019蓝桥杯之完全二叉树的权值(Python)

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里先简单的说一下完全二叉树和满二叉树的区别:
先上两张图:
在这里插入图片描述
在这里插入图片描述
简而言之,完全二叉树和满二叉树的区别就是:
满二叉树深度为k就有2^(k+1) - 1个结点;
完全二叉树除去最后一层即为满二叉树。
所以满二叉树是特殊的完全二叉树。
(样例为满二叉树)

接下来说这道题的思路,很简单,将每一层的权值都存放在一个列表里,最后找出列表里数字最大的第一个数字的下标加一即为结果。
以样例为例:

输入->[1,6,5,4,3,2,1]

在这里插入图片描述
这里我求每层权值的方法是:
先将输入列表里的第一个数字(前[0+1]层)添加到权值列表里,然后将其赋0,
然后将前[1+1]层数字和添加到权值列表,这些数字再全部赋0…

[1,6,5,4,3,2,1]
[0,6,5,4,3,2,1]  --  [1]
[0,0,0,4,3,2,1]  --  [1,11]
[0,0,0,0,0,0,0]  --  [1,11,10]
权值列表:lists=[1,11,10]

找出最大的下标加一:

lists[1]最大->  1 + 1 = 2

但是这样会有一个问题:我是先将前(n+1)层(n从0开始)节点数之和deep(n)与输入列表长度对比,如果树的最后一层不满的话,如果算上最后一层,deep(n)的长度会超出输入列表的长度,所以deep不会包括最后的不满的那一层,这就引发了问题。因为样例给出的是一棵满二叉树,它是一棵特殊的完全二叉树,看不出来结果错误,但是对于一般的完全二叉树,如:

输入->[1,6,5,4,3,2,1,999]
权值列表:lists=[1,11,10,999]

在这里插入图片描述
如果继续用上面的方法,他会丢掉最后一层,依旧返回的是第二层权值最大(但事实显然不是这样)。
这里我采取的方法是将其补成一棵满二叉树:
在这里插入图片描述
这样你的输入列表就变成了:

[1,6,5,4,3,2,1,999,0,0,0,0,0,0,0]

权值列表依旧不变:

[1,11,10,999]

这样deep就不会超出输入列表长度了。

接下来上源码:

#满二叉树前(n+1)层节点之和(n从0开始)
def deep(n):
    return (2**(n+1)-1)

#判断是否为满二叉树,如果是的话,不操作,否则将其补满为一棵满二叉树
def isfulltree(slist):
    deep_list=[] #每添加一层,的节点数
    for i in range(17): #2**17=131071>100000
        deep_list.append(deep(i))
    for i in range(len(deep_list)):
        if len(slist)==deep_list[i]:
            # num=1
            pass
        else:
            if len(slist)<deep_list[i] and len(slist)>deep_list[i-1]:
                for j in range(len(slist),deep_list[i]):
                    slist.append(0)
    return slist

#列表前n项和
def sum_list(slist,n): 
    sum=0
    for i in range(n):
        sum+=slist[i]
    return sum

#找出列表里最大的数的下标
def max_address(slist):
    index=0
    for i in range(len(slist)):
        if slist[i]>slist[index]:
            index=i
    return index+1

def main():
    n=int(input())
    slist=list(map(int,input().split()))
    slist=isfulltree(slist)
    lists=[] #每层权值
    n=0
    while deep(n)<=len(slist) :
        sum=0
        sum+=sum_list(slist,deep(n))
        lists.append(sum)
        for i in range(deep(n)):
            slist[i]=0
        n+=1
    maxs=max_address(lists)
    print(maxs)

main()

测试结果:
1)
在这里插入图片描述
2)
在这里插入图片描述

发布了20 篇原创文章 · 获赞 10 · 访问量 1230

猜你喜欢

转载自blog.csdn.net/qq_43613793/article/details/103096117