📅  最后修改于: 2023-12-03 15:36:20.530000             🧑  作者: Mango
此主题涉及树的遍历,具体来说是二叉树的遍历。在二叉树中,有三种遍历方式:前序遍历、中序遍历和后序遍历,每种遍历方式都有其特点。这里以前序遍历为例,来介绍如何从给定节点到根的路径。
前序遍历是指先遍历根节点,再遍历左子树,最后遍历右子树。我们可以利用递归的方式来实现前序遍历,具体流程如下:
根据上述流程,我们可以在递归中维护一个栈,每次遍历一个节点时,将其入栈;每次完成左子树遍历后,将栈顶元素出栈并遍历其右子树。直到栈为空,遍历结束。
具体实现如下:
def print_path(root, target):
if not root:
return False
stack = [] # 初始化栈
stack.append(root) # 根节点入栈
while stack: # 栈不为空,继续遍历
node = stack.pop() # 取出栈顶元素
if node == target:
# 如果当前节点等于目标节点,就输出栈中所有节点的值
path = [node.val for node in stack]
path.append(target.val)
return path
if node.right:
stack.append(node.right) # 右节点入栈
if node.left:
stack.append(node.left) # 左节点入栈
return False # 遍历完整棵树,未找到目标节点,返回False
在上述代码中,我们首先创建了一个空栈,将根节点入栈。然后,当栈不为空时,取出栈顶元素并判断是否和目标节点相等,如果相等,则输出栈中所有节点的值;如果不相等,则先将右节点入栈,再将左节点入栈。
遍历二叉树的方式有很多,每种方式都有其特定的应用场景。在本主题中,我们介绍了如何利用前序遍历来找到给定节点到根的路径。用递归实现前序遍历非常简单,而用迭代实现则需要维护一个栈来保存遍历过的节点。实现方法虽然不同,但遍历的过程是相似的,通过多次练习,相信大家能够理解并熟练掌握。