📜  二叉树中以孩子为主要因子的节点数(1)

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

二叉树中以孩子为主要因子的节点数

在二叉树中,一个节点可以拥有 0、 1 或 2 个子节点。其中,以每个节点的孩子节点为主要因子的节点被定义为:如果该节点拥有一个左子节点或右子节点,则以该子节点的值为主要因子;如果该节点拥有两个子节点,则以左子节点的值为主要因子。

以下是一个例子:

     5
   /   \
  2     6
 / \   / \
1   4 7   8

在上面的二叉树中,2 是以左子节点 1 为主要因子的节点,6 是以右子节点 7 为主要因子的节点,5 是以左子节点 2 和右子节点 6 的最小公共祖先 5(它们的值相等)为主要因子的节点。因此,该二叉树中共有 3 个满足条件的节点。

编写一个函数 countChildDependentNodes(root: TreeNode) -> int,该函数计算以孩子为主要因子的节点数。

数据结构

根据以上定义,我们需要用到树节点 TreeNode 的定义。其中,每个节点包含了一个整数值 val,以及指向左子节点和右子节点的指针 leftright

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
算法思路

我们可以使用递归的方式遍历二叉树,并统计以孩子为主要因子的节点数目。

我们首先判断当前节点是否存在左右子节点,如果存在,则分别递归到左右子节点上,并以左右子节点的值作为主要因子,统计它们的节点数目。

如果当前节点存在两个子节点,那么以左子节点的值作为主要因子。否则,以左右子节点中存在的非空子节点的值作为主要因子。

最后,如果当前节点存在孩子为主要因子的节点,则需要加上当前节点。

代码实现

以下是 Python 代码实现,其中 countChildDependentNodes 函数接受一个二叉树的根节点,返回以孩子为主要因子的节点数目。

class Solution:
    def countChildDependentNodes(self, root: TreeNode) -> int:
        def dfs(node: TreeNode, dependent: int) -> int:
            if not node:
                return 0
            count = 0
            if node.left and node.right:
                if node.left.val == node.right.val:
                    count += dfs(node.left, node.left.val)
                    count += dfs(node.right, node.right.val)
                else:
                    count += dfs(node.left, node.left.val)
                    count += dfs(node.right, node.right.val)
            elif node.left:
                count += dfs(node.left, node.left.val)
            elif node.right:
                count += dfs(node.right, node.right.val)
            if dependent == node.val:
                count += 1
            return count
        return dfs(root, None)
时间复杂度

本算法需要遍历二叉树中的所有节点,时间复杂度为 O(n),其中 n 是二叉树的节点数目。

空间复杂度

本算法需要使用栈保存递归过程中的中间变量,空间复杂度为 O(h),其中 h 是二叉树的高度。因为在最坏情况下,二叉树的高度为 n,此时会使用 O(n) 的空间。