在这里先简单的说一下完全二叉树和满二叉树的区别:
先上两张图:
简而言之,完全二叉树和满二叉树的区别就是:
满二叉树深度为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)