📌  相关文章
📜  打印二叉树给定节点的子树中存在的所有节点(1)

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

打印二叉树给定节点的子树中存在的所有节点

本文讨论如何在二叉树中打印给定节点的子树中存在的所有节点。首先我们需要明确什么是二叉树以及节点的概念。

什么是二叉树?

二叉树是由节点和边组成的数据结构,每个节点至多有两个子节点,分别称作左子节点和右子节点。每个节点都具有一个值,也可以是空值(NULL)。根节点是二叉树中最上面的节点,根节点的左右子树也是二叉树。

如何打印二叉树中给定节点的子树中的所有节点?

如果要打印整个二叉树中某个节点的子树中的所有节点,我们需要遍历这个节点的子树。有以下几种遍历方式:

  1. 前序遍历:先访问根节点,然后递归访问左子树和右子树;
  2. 中序遍历:先递归访问左子树,然后访问根节点,最后递归访问右子树;
  3. 后序遍历:先递归访问左子树和右子树,最后访问根节点。

下面我们以前序遍历为例,编写程序打印给定节点的子树中所有节点,并返回结果。

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

def preorder(root: Node, result: List[int], target: int) -> List[int]:
    """
    打印给定节点的子树中所有节点
    """
    if not root:
        return
    if root.val == target:
        result.append(root.val)
    preorder(root.left, result, target)
    preorder(root.right, result, target)
    if root.val != target and (root.left and root.left.val == target or root.right and root.right.val == target):
        result.append(root.val)
    return result

# 示例
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)

print(preorder(root, [], 3))  # [3, 6, 7]

上述程序中,我们使用了前序遍历的方式打印给定节点的子树中所有节点。如果当前节点的值等于给定值,将其加入结果数组;否则如果其左子节点或右子节点的值等于给定值,将当前节点加入结果数组。最终返回结果数组。

总结

本文介绍了如何打印二叉树中给定节点的子树中存在的所有节点,并给出了一种使用前序遍历的方法。读者可以根据需要进行修改和扩展。