📜  二叉树的边界级顺序遍历(1)

📅  最后修改于: 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列表来存储左子树的边界节点。

随后,添加了根节点,遍历左子树并添加左子树的边界节点。遍历右子树并添加右子树的边界节点,然后反转右子树的边界节点(逆时针遍历边界节点需要从下到上)。最后,在遍历叶子节点时添加叶子节点。

最终,将左子树边界节点、叶子节点和右子树边界节点合并起来,并返回结果。