📅  最后修改于: 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
,以及指向左子节点和右子节点的指针 left
和 right
。
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) 的空间。