温室的大棚

在一个温室大棚中种有西红柿。该温室大棚使用种植架来种植西红柿,并使用人造光来照射西红柿。在种植架上的西红柿果实以二叉树的结构排列,二叉树的节点代表西红柿,二叉树的链接代表茎。

不幸的是,温室大棚两侧的照射灯只有右侧的工作,而左侧的灯因某些原因无法使用。种植人员在准备收获西红柿时才发现这些问题。检查后发现,因为光的接受度不够,只有每一层种植架上最右侧的西红柿正常成熟,可以食用。现给出种植架上西红柿的二叉树结构,求如果在上述情况下,有多少西红柿是成熟的。

从问题的描述中可以知道,在这道题中可以用广度优先搜索算法来处理树结构的图。

如图所示,光只从右侧照射,因此能成熟的西红柿只有最右侧的节点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)

输入

二叉树图示

输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

algorithm6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值