📅  最后修改于: 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
类来表示二叉树节点。接着,我们定义了printLeftBoundary
、printLeaves
和printRightBoundary
三个函数来分别遍历左边界节点、叶子节点和右边界节点。最后,我们定义了printBoundary
函数来打印所有边界节点。
运行该代码,可以得到边界根到叶路径的遍历结果。