📜  打印二叉树的所有素数(1)

📅  最后修改于: 2023-12-03 14:54:27.591000             🧑  作者: Mango

打印二叉树的所有素数

本文将介绍如何在二叉树中找到所有的素数,并打印出来。在编写代码前,我们先来了解一下什么是素数。

素数

素数是指只能被1和自身整除的正整数,比如2、3、5、7、11等。我们可以用以下方法判断一个数是否为素数:

def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

这里用到了一个优化技巧:如果一个数不是素数,那么它的最小因子一定小于等于它的平方根。

遍历二叉树

接下来我们需要遍历二叉树来寻找素数。我们可以使用深度优先遍历(dfs)或广度优先遍历(bfs)来实现。

def dfs(node):
    if node is None:
        return
    if is_prime(node.val):
        print(node.val)
    dfs(node.left)
    dfs(node.right)
def bfs(node):
    queue = [node]
    while queue:
        cur = queue.pop(0)
        if cur is None:
            continue
        if is_prime(cur.val):
            print(cur.val)
        queue.append(cur.left)
        queue.append(cur.right)

以上两段代码分别实现了dfs和bfs的遍历方式,我们只需要在遍历过程中判断节点的值是否为素数即可。

组合起来

现在我们可以将以上两部分的代码组合起来实现打印二叉树中所有素数的功能了。

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

def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

def dfs(node):
    if node is None:
        return
    if is_prime(node.val):
        print(node.val)
    dfs(node.left)
    dfs(node.right)

def bfs(node):
    queue = [node]
    while queue:
        cur = queue.pop(0)
        if cur is None:
            continue
        if is_prime(cur.val):
            print(cur.val)
        queue.append(cur.left)
        queue.append(cur.right)

if __name__ == '__main__':
    root = TreeNode(10)
    root.left = TreeNode(5)
    root.right = TreeNode(15)
    root.left.left = TreeNode(3)
    root.left.right = TreeNode(7)
    root.right.left = TreeNode(12)
    root.right.right = TreeNode(20)

    print('dfs:')
    dfs(root)

    print('bfs:')
    bfs(root)

以上代码中,我们定义了一个二叉树节点类TreeNode,并初始化了一棵树。在程序的最后,我们分别使用dfs和bfs遍历这棵树,并打印出所有的素数。

总结

本文介绍了如何实现打印二叉树中所有素数的功能,包括判断一个数是否为素数,以及使用dfs和bfs遍历二叉树。虽然题目看起来比较简单,但实际实现起来还是有些技巧和细节的。希望本文能帮助到大家。