要实现一个层序遍历的代码,并获取每一层的节点数据,你可以使用广度优先搜索(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)) # 打印每一层的节点值
解释:
-
树节点类
TreeNode
: 表示二叉树节点,包含值val
、左子节点left
和右子节点right
。 -
levelOrder
函数: 进行层序遍历,返回一个列表,其中每个内部列表代表树的一个层次。- 首先,将根节点放入队列。
- 然后,在每次迭代中,从队列中取出所有当前层的节点,并将它们的子节点放入队列中。
- 最终,把每层的值存储到
result
列表中。
-
示例树构建: 创建一个具体的二叉树例子,并调用层序遍历函数输出结果。
运行该代码将输出如下结果:
[[1], [2, 3], [4, 5, 6, 7]]
这样,你可以获取每一层的节点数据。如果你只想要某一层的特定节点(比如最后一层)或特定条件的节点,你可以在此基础上进行进一步的筛选。
上面的代码使用层序遍历(广度优先搜索)方法来收集每一层的节点值并返回一个列表,其中分层的结构被保留。这与仅获取特定节点(如右侧视图)有所不同。下面是几个主要的区别和功能说明:
-
输出结构:
- 层序遍历的代码返回一个包含每一层节点值的二维列表。例如,对于给定的二叉树,返回
[[1], [2, 3], [4, 5, 6, 7]]
,表示第一层有节点1
,第二层有节点2
和3
,第三层有节点4
,5
,6
, 和7
。 - 右侧视图的输出仅包含每一层最右边的节点。例如,右侧视图对于同一二叉树将返回
[1, 3, 7]
。
- 层序遍历的代码返回一个包含每一层节点值的二维列表。例如,对于给定的二叉树,返回
-
实现逻辑:
- 上面的层序遍历会遍历每一层的所有节点,通过一个循环将每层的节点都加入到结果列表中。
- 如果要实现右侧视图,则需要调整逻辑,只记录每一层的最后一个节点。可以通过修改第二个循环,例如仅在循环的最后一次迭代时将节点值添加到结果列表来完成。
示例:获取右侧视图的代码
如果你需要获取右侧视图,这里是一个简单的例子来修改上述代码以实现这一点:
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]
总结:
- 层序遍历函数返回整个树的每层节点,适合需要图结构的使用场景。
- 右侧视图函数只返回每一层的最后节点,适合特定的可视化或某些搜索需求。
两者代码的结构非常相似,但处理的逻辑和目标输出是不同的,具体选择哪个功能取决于你的需求。