📌  相关文章
📜  二叉树的边界根到叶路径遍历(1)

📅  最后修改于: 2023-12-03 15:36:03.545000             🧑  作者: Mango

二叉树的边界根到叶路径遍历

二叉树的边界根到叶路径遍历是指从根节点到叶子节点的路径上,所有在边界上的节点都被遍历到的过程。边界节点是指既不是叶子节点也不是父节点的节点。在边界根到叶路径遍历中,对于叶子节点,只需要遍历一次,对于边界节点,需要遍历两次,一次在遍历左子树时,一次在遍历右子树时。对于普通节点,只需要在其不是边界节点的情况下,按照前序遍历的方式遍历即可。

下面是一个示例二叉树:

      1
    /   \
   2     3
  / \   / \
 4   5 6   7
    / \
   8   9

该二叉树的边界根到叶路径的遍历顺序为:1, 2, 4, 5, 8, 9, 6, 7, 3。其中,1是根节点,2、3是边界节点,4、5、8、9、6、7是叶子节点。

实现代码

在代码实现中,我们可以使用三个函数来实现边界根到叶路径的遍历。分别是:

  • printLeftBoundary:遍历左边界节点
  • printLeaves:遍历所有叶子节点
  • printRightBoundary:遍历右边界节点

其中,打印边界节点时按照如下顺序打印:

  • 打印根节点
  • 打印所有左边界节点(除了根节点和最底层的节点)
  • 打印所有叶子节点
  • 打印所有右边界节点(除了根节点和最底层的节点)

下面是代码实现:

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

def printLeftBoundary(node):
    if not node:
        return
    if node.left:
        print(node.val, end=' ')
        printLeftBoundary(node.left)
    elif node.right:
        print(node.val, end=' ')
        printLeftBoundary(node.right)

def printLeaves(node):
    if not node:
        return
    printLeaves(node.left)
    if not node.left and not node.right:
        print(node.val, end=' ')
    printLeaves(node.right)

def printRightBoundary(node):
    if not node:
        return
    if node.right:
        printRightBoundary(node.right)
        print(node.val, end=' ')
    elif node.left:
        printRightBoundary(node.left)
        print(node.val, end=' ')

def printBoundary(node):
    if not node:
        return
    print(node.val, end=' ')
    printLeftBoundary(node.left)
    printLeaves(node.left)
    printLeaves(node.right)
    printRightBoundary(node.right)

# 测试代码
if __name__ == '__main__':
    root = Node(1)
    root.left = Node(2)
    root.right = Node(3)
    root.left.left = Node(4)
    root.left.right = Node(5)
    root.right.left = Node(6)
    root.right.right = Node(7)
    root.left.right.left = Node(8)
    root.left.right.right = Node(9)

    printBoundary(root)  # 输出 1 2 4 5 8 9 6 7 3

在该代码中,我们定义了一个Node类来表示二叉树节点。接着,我们定义了printLeftBoundaryprintLeavesprintRightBoundary三个函数来分别遍历左边界节点、叶子节点和右边界节点。最后,我们定义了printBoundary函数来打印所有边界节点。

运行该代码,可以得到边界根到叶路径的遍历结果。