📜  从节点到给定完整二叉树的根的打印路径(1)

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

从节点到给定完整二叉树的根的打印路径

此主题涉及树的遍历,具体来说是二叉树的遍历。在二叉树中,有三种遍历方式:前序遍历、中序遍历和后序遍历,每种遍历方式都有其特点。这里以前序遍历为例,来介绍如何从给定节点到根的路径。

前序遍历

前序遍历是指先遍历根节点,再遍历左子树,最后遍历右子树。我们可以利用递归的方式来实现前序遍历,具体流程如下:

  1. 如果当前节点为空,则返回。
  2. 打印当前节点。
  3. 遍历左子树。
  4. 遍历右子树。

根据上述流程,我们可以在递归中维护一个栈,每次遍历一个节点时,将其入栈;每次完成左子树遍历后,将栈顶元素出栈并遍历其右子树。直到栈为空,遍历结束。

具体实现如下:

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

在上述代码中,我们首先创建了一个空栈,将根节点入栈。然后,当栈不为空时,取出栈顶元素并判断是否和目标节点相等,如果相等,则输出栈中所有节点的值;如果不相等,则先将右节点入栈,再将左节点入栈。

总结

遍历二叉树的方式有很多,每种方式都有其特定的应用场景。在本主题中,我们介绍了如何利用前序遍历来找到给定节点到根的路径。用递归实现前序遍历非常简单,而用迭代实现则需要维护一个栈来保存遍历过的节点。实现方法虽然不同,但遍历的过程是相似的,通过多次练习,相信大家能够理解并熟练掌握。