■ 题目描述
【数组二叉树】
二叉树也可以用数组来存储,给定一个数组,树的根节点的值存储在下标1,对于存储在下标N的节点,它的左子节点和右子节点分别存储在下标2*N和2*N+1,并且我们用值-1代表一个节点为空。
给定一个数组存储的二叉树,试求从根节点到最小的叶子节点的路径,路径由节点的值组成。
输入描述
输入一行为数组的内容,数组的每个元素都是正整数,元素间用空格分隔。
注意第一个元素即为根节点的值,即数组的第N个元素对应下标N,下标0在树的表示中没有使用,所以我们省略了。
输入的树最多为7层。
输出描述
输出从根节点到最小叶子节点的路径上,各个节点的值,由空格分隔,用例保证最小叶子节点只有一个。
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3 5 7 -1 -1 2 4
输出
3 7 2
说明
数组存储的二叉树如图,故到最小叶子节点的路径为3 7 2。
示例2 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
5 9 8 -1 -1 7 -1 -1 -1 -1 -1 6
输出
5 8 7 6
说明
数组存储的二叉树如图,故到最小叶子节点的路径为10 8 7 6,注意数组仅存储至最后一个非空节点,故不包含节点“7”右子节点的-1。
以下代码为本人原创,可以供大家参考,若有不足之处,感谢指出!!!!
while stack:
stack1 = []
for node in stack:
if 0 <= node[1]*2-1 < len(nums):
if nums[node[1]*2-1] == -1:
node[0].left = None
else:
b = Tree(nums[node[1] * 2 - 1])
node[0].left = b
stack1.append([b, node[1] * 2])
else:
node[0].left = None
if 0 <= node[1]*2 < len(nums):
if nums[node[1]*2] == -1:
node[0].right = None
else:
b = Tree(nums[node[1]*2])
node[0].right = b
stack1.append([b, node[1]*2+1])
else:
node[0].right = None
if not node[0].left and not node[0].right:
res.append([node[0].val, node[1]])
stack = stack1
res.sort(key=lambda x: x[0])
num = res[0][1]
cur = [num]
while num > 1:
if num%2 == 0:
num = num//2
cur.append(num)
else:
num = (num-1)//2
cur.append(num)
ans = []
for i in range(len(cur)-1, -1, -1):
ans.append(nums[cur[i]-1])
print(' '.join(list(map(str, ans))))