在一个温室大棚中种有西红柿。该温室大棚使用种植架来种植西红柿,并使用人造光来照射西红柿。在种植架上的西红柿果实以二叉树的结构排列,二叉树的节点代表西红柿,二叉树的链接代表茎。
不幸的是,温室大棚两侧的照射灯只有右侧的工作,而左侧的灯因某些原因无法使用。种植人员在准备收获西红柿时才发现这些问题。检查后发现,因为光的接受度不够,只有每一层种植架上最右侧的西红柿正常成熟,可以食用。现给出种植架上西红柿的二叉树结构,求如果在上述情况下,有多少西红柿是成熟的。
从问题的描述中可以知道,在这道题中可以用广度优先搜索算法来处理树结构的图。
如图所示,光只从右侧照射,因此能成熟的西红柿只有最右侧的节点1、节点3、节点6、节点7。
所以本题的核心:寻找二叉树每一层中最右侧的节点。
采用广度优先搜索算法来解决此问题:按照从根节点到底端叶子节点的顺序,找出可以获取的节点的值的问题。
只需要将一整层放入队列,寻找到最右边的节点,再通过队列中的节点更新下一层的节点,将所有下一层的节点放入队列,并把前一层的节点移出队列,直到没有节点可以加入队列,队列为空为止。
class treenode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def bfs(root):
mature = []
queue = [root]
while queue:
level_size = len(queue) # 得到每一层的长度
mature.append(queue[-1].val) # 获取最右侧的值
for i in range(level_size):
top = queue.pop(0) # 先排出左侧
if top.left:
queue.append(top.left)
if top.right:
queue.append(top.right)
return mature
Input = []
tree = []
Input = input("从根节点到叶子节点,从左叶子节点到右叶子节点依次输入:").split(" ")
cnt = 1
for item in Input:
tmp = treenode(item)
tree.append(tmp)
for item in tree:
if item.val == "null":
continue
if 2 * cnt <= len(Input) and tree[2 * cnt - 1].val != "null":
item.left = tree[2 * cnt - 1]
if 2 * cnt + 1 <= len(Input) and tree[2 * cnt].val != "null":
item.right = tree[2 * cnt]
cnt += 1
ans = bfs(tree[0])
print("成熟的西红柿:", ans)
输入
二叉树图示
输出