📜  门| Gate IT 2007 |问题16(1)

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

门 | Gate IT 2007 | 问题16

问题描述

有一个二叉树,每个节点有数值和一个标志位。标志位初始值为 false,操作有两种:

  • 将某一节点及其子树的所有标志位设为 true。
  • 判断某一节点及其子树中是否有标志位为 true 的节点。

请您维护这棵二叉树,并按照题目描述实现以上操作。

解题思路

我们可以使用递归来实现这个问题。

对于操作 1,我们只需要递归地将该节点的左右子树的标志位都设为 true 即可。

对于操作 2,如果该节点的标志位为 true,则返回 true;否则,递归地判断该节点的左右子树是否有标志位为 true 的节点即可。

需要注意的是,对于每个节点,我们需要同时维护数值和标志位。

代码实现

以下是使用 Python 语言实现的代码片段:

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

class Tree:
    def __init__(self, root=None):
        self.root = root

    def set_flag(self, node):
        if node:
            node.flag = True
            self.set_flag(node.left)
            self.set_flag(node.right)

    def has_flag(self, node):
        if not node:
            return False
        if node.flag:
            return True
        return self.has_flag(node.left) or self.has_flag(node.right)
总结

本题考查了递归的使用,也考查了对二叉树的基本操作。需要注意的是,当涉及到递归时,要考虑清楚递归的边界条件,否则容易出现无限递归的错误。