层序遍历python

要实现一个层序遍历的代码,并获取每一层的节点数据,你可以使用广度优先搜索(BFS)的方法。下面是一个 Python 示例,该代码通过队列完成层序遍历,将结果逐层收集到一个列表中。

这里的代码将打印每一层的节点,而不是仅仅是右侧视图:

from collections import deque
from typing import List, Optional

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def levelOrder(root: Optional[TreeNode]) -> List[List[int]]:
    if not root:
        return []

    result = []
    queue = deque([root])

    while queue:
        level_size = len(queue)  # 当前层的节点数量
        level_nodes = []  # 存储当前层的节点

        for _ in range(level_size):
            node = queue.popleft()  # 弹出队列中的节点
            level_nodes.append(node.val)  # 记录当前节点的值
            
            # 将左子节点和右子节点添加到队列中
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)

        result.append(level_nodes)  # 将当前层的结果添加到最终结果中

    return result

# 构造示例树并运行层序遍历
if __name__ == '__main__':
    # 创建树: [1, 2, 3, 4, 5, 6, 7]
    root = TreeNode(1)
    root.left = TreeNode(2)
    root.right = TreeNode(3)
    root.left.left = TreeNode(4)
    root.left.right = TreeNode(5)
    root.right.left = TreeNode(6)
    root.right.right = TreeNode(7)

    print(levelOrder(root))  # 打印每一层的节点值

解释:

  1. 树节点类 TreeNode: 表示二叉树节点,包含值 val、左子节点 left 和右子节点 right

  2. levelOrder 函数: 进行层序遍历,返回一个列表,其中每个内部列表代表树的一个层次。

    • 首先,将根节点放入队列。
    • 然后,在每次迭代中,从队列中取出所有当前层的节点,并将它们的子节点放入队列中。
    • 最终,把每层的值存储到 result 列表中。
  3. 示例树构建: 创建一个具体的二叉树例子,并调用层序遍历函数输出结果。

运行该代码将输出如下结果:

[[1], [2, 3], [4, 5, 6, 7]]

这样,你可以获取每一层的节点数据。如果你只想要某一层的特定节点(比如最后一层)或特定条件的节点,你可以在此基础上进行进一步的筛选。
上面的代码使用层序遍历(广度优先搜索)方法来收集每一层的节点值并返回一个列表,其中分层的结构被保留。这与仅获取特定节点(如右侧视图)有所不同。下面是几个主要的区别和功能说明:

  1. 输出结构

    • 层序遍历的代码返回一个包含每一层节点值的二维列表。例如,对于给定的二叉树,返回 [[1], [2, 3], [4, 5, 6, 7]],表示第一层有节点 1,第二层有节点 23,第三层有节点 4, 5, 6, 和 7
    • 右侧视图的输出仅包含每一层最右边的节点。例如,右侧视图对于同一二叉树将返回 [1, 3, 7]
  2. 实现逻辑

    • 上面的层序遍历会遍历每一层的所有节点,通过一个循环将每层的节点都加入到结果列表中。
    • 如果要实现右侧视图,则需要调整逻辑,只记录每一层的最后一个节点。可以通过修改第二个循环,例如仅在循环的最后一次迭代时将节点值添加到结果列表来完成。

示例:获取右侧视图的代码

如果你需要获取右侧视图,这里是一个简单的例子来修改上述代码以实现这一点:

def rightSideView(root: Optional[TreeNode]) -> List[int]:
    if not root:
        return []

    result = []
    queue = deque([root])

    while queue:
        level_size = len(queue)  # 当前层的节点数量

        for i in range(level_size):
            node = queue.popleft()  # 从队列中弹出节点
            
            # 仅在最后一个节点时记录值
            if i == level_size - 1:
                result.append(node.val)

            # 将左右子节点添加到队列中
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)

    return result

# 构造示例树并运行右侧视图遍历
if __name__ == '__main__':
    root = TreeNode(1)
    root.left = TreeNode(2)
    root.right = TreeNode(3)
    root.left.left = TreeNode(4)
    root.left.right = TreeNode(5)
    root.right.left = TreeNode(6)
    root.right.right = TreeNode(7)

    print(rightSideView(root))  # 打印右侧视图

输出:

运行右侧视图的代码将输出:

[1, 3, 7]

总结:

  • 层序遍历函数返回整个树的每层节点,适合需要图结构的使用场景。
  • 右侧视图函数只返回每一层的最后节点,适合特定的可视化或某些搜索需求。

两者代码的结构非常相似,但处理的逻辑和目标输出是不同的,具体选择哪个功能取决于你的需求。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值