📅  最后修改于: 2023-12-03 15:21:40.348000             🧑  作者: Mango
二叉树是一种常见的数据结构,其遍历方式包括前序遍历、中序遍历、后序遍历和层次遍历等。而二叉树的边界级顺序遍历则是指遍历二叉树的最外层边界节点。
二叉树的边界节点需要通过递归来查找。在递归过程中,首先遍历二叉树的左子树,然后遍历二叉树的右子树。在遍历二叉树的左子树和右子树时,需要分别判断当前节点是否是边界节点。
对于左子树,边界节点包括根节点和所有只有左子树的节点;对于右子树,边界节点包括根节点和所有只有右子树的节点。而对于根节点,如果既没有左子树也没有右子树,那么根节点就是边界节点。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def boundaryOfBinaryTree(self, root: TreeNode) -> List[int]:
if not root:
return []
def is_leaf(node):
return not node.left and not node.right
left_boundary = []
# 首先添加根节点
if not is_leaf(root):
left_boundary.append(root)
# 遍历左子树,添加边界节点
node = root.left
while node:
if not is_leaf(node):
left_boundary.append(node)
if node.left:
node = node.left
else:
node = node.right
# 遍历右子树,添加边界节点
right_boundary = []
node = root.right
while node:
if not is_leaf(node):
right_boundary.append(node)
if node.right:
node = node.right
else:
node = node.left
# 反转右子树的边界节点,因为逆时针遍历边界节点需要从下到上
right_boundary.reverse()
# 遍历叶子节点,并添加边界节点
leaves = []
def dfs(node):
if is_leaf(node):
leaves.append(node)
return
if node.left:
dfs(node.left)
if node.right:
dfs(node.right)
dfs(root)
# 构造边界节点,并返回结果
return [node.val for node in left_boundary] + [node.val for node in leaves] + [node.val for node in right_boundary]
以上代码中,Solution
类表示边界遍历的解决方案,boundaryOfBinaryTree
方法接收二叉树的根节点,并返回边界节点。
在boundaryOfBinaryTree
方法中,首先定义了is_leaf
函数来判断节点是否为叶子节点。然后定义了left_boundary
列表来存储左子树的边界节点。
随后,添加了根节点,遍历左子树并添加左子树的边界节点。遍历右子树并添加右子树的边界节点,然后反转右子树的边界节点(逆时针遍历边界节点需要从下到上)。最后,在遍历叶子节点时添加叶子节点。
最终,将左子树边界节点、叶子节点和右子树边界节点合并起来,并返回结果。